On 03.11.2014 02:59, Xiangrong Fang wrote:
2014-11-03 2:50 GMT+08:00 Sven Barth <pascaldra...@googlemail.com
<mailto:pascaldra...@googlemail.com>>:

    If you use SetLength the dynamic array consists not only of the
    array data, but also of an information record in front of it. This
    will likely lead to the data not being aligned correctly (FillQWord
    works best with 8-Byte alignment). So what about testing FillDWord
    or FillChar? Just to see whether they would be faster.

​It is quite strange that if I use SetLength+FillByte, it is really
faster (for the FillByte), but if I use GetMemory+FillByte, it is not
faster than using FillDWord or FillQWord.

Then it's indeed as I suspected. The memory buffer itself that is allocated by SetLength is allocated, but the pointer returned to you (what you get as a dynamic array) has - at least for FillQWord - a bad alignment. Looking at the source though it should still be 8-Byte aligned though (the information record has a size of 8 on 32-bit systems)... *sigh*

Please also note that not on every system the Fill* methods are implemented in assembler. FillChar mostly is, FillWord and FillDWord perhaps, but FillQWord mostly seldomly (it's e.g. not even implemented that way on x86_64). So especially on 32-bit system 2 32-bit moves are used each. Thus FillQWord is not always the optimal choice and I'd suggest that you time the different Fill* functions especially on different platforms.

Would you mind to show the timings that you got for FillChar? :)

I found this in FPC doc (for $ALIGN switch):

This switch is recognized for Turbo Pascal Compatibility, but is not yet
implemented. The alignment of data will be different in any case, since
Free Pascalis a 32-bit compiler.

​It is a pity that this switch is not recognized yet. But I need to
understand the last statement, will alignment be different or not?

I think that last statement is ment regarding that Turbo Pascal is a 16-bit compiler which had different alignment values available than FPC needs. I don't know what TP supported back then, but I don't imagine that it supported e.g. 16-Byte alignment.

Additionally this switch won't help you. The memory buffer that is allocated by SetLength is also allocated using GetMemory. So the buffer itself *is* aligned. But you don't get the start byte of the buffer in case of SetLength, but the first byte after the information record which might not be aligned correctly and *no* compiler switch will help you with that.

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to