You are not logged in.
Pages: 1
I'm happy to announce that the today's commit fixed most 64 bit compilation problems of mORMot.
See http://synopse.info/fossil/info/fb893df6fe
ORM and services are now working.
Low-level x64 assembler stubs have been created and tested.
I suspect some part of official System.RTTI unit as provided in XE2/XE3 is broken in Win64.
For instance, I think it does not handle a method returning a string.
Our mORMot.pas implementation has been tested with the same regression code as in 32 bit mode.
Your own tests and feedback are welcome.
SQlite3 works great in 64 bit mode.
I've used the 3.7.10 dll version included in http://sourceforge.net/p/zeoslib/code-0 … lite/Win64 - since there is no official Win64 library released in http://sqlite.org
No problem so far, and pretty good performance.
Jut a weird bug of SQLITE_TRANSIENT constant, which should be pointer(integer(-1)) instead of pointer(-1) when working with virtual tables columns - but nothing to care of in your user code, since the framework will do it for you.
Still needs to test SynDB* units, and UI part of the framework.
Should not be the highest priority, I suppose, since most interest in 64 bit is on server side.
Resulting speed is great - just a bit slower than 32 bit version (10-20%).
Speed decrease seems to be mostly due to doubled pointer size, and some less optimized part of the official Delphi RTL.
But Synopse core uses its own functions (e.g. for JSON serialization, RTTI support or interface calls or stubbing), so we were able to release the whole 64 bit power of your hardware.
Delphi 64 bit compiler sounds stable and efficient.
Regression tests passed as such:
Synopse mORMot Framework Automated tests
------------------------------------------
1. Synopse libraries
1.1. Low level common:
- System copy record: 22 assertions passed 148us
- TDynArray: 959,443 assertions passed 111.75ms
- TDynArrayHashed: 1,200,629 assertions passed 97.36ms
- Fast string compare: 7 assertions passed 93us
- IdemPropName: 10 assertions passed 86us
- Url encoding: 105 assertions passed 602us
- IsMatch: 599 assertions passed 134us
- Soundex: 35 assertions passed 65us
- Numerical conversions: 786,378 assertions passed 77.90ms
- Curr64: 20,053 assertions passed 1.93ms
- CamelCase: 5 assertions passed 56us
- Bits: 4,614 assertions passed 68us
- Ini files: 7,004 assertions passed 50.00ms
- Unicode - Utf8: 65,089 assertions passed 733.31ms
- Iso8601 date and time: 24,000 assertions passed 3.24ms
- Url decoding: 1,100 assertions passed 231us
- TSynTable: 41 assertions passed 1.36ms
- TSynCache: 404 assertions passed 518us
- TSynFilter: 804 assertions passed 1.51ms
- TSynValidate: 677 assertions passed 519us
- TSynLogFile: 42 assertions passed 323us
Total failed: 0 / 3,071,061 - Low level common PASSED 1.08s
1.2. Low level types:
- RTTI: 34 assertions passed 299us
- Url encoding: 200 assertions passed 426us
- Encode decode JSON: 251,055 assertions passed 74.03ms
Total failed: 0 / 251,289 - Low level types PASSED 76.98ms
1.3. Big table:
- TSynBigTable: 19,264 assertions passed 32.59ms
- TSynBigTableString: 16,248 assertions passed 14.13ms
- TSynBigTableMetaData: 384,060 assertions passed 763.51ms
- TSynBigTableRecord: 452,185 assertions passed 1.67s
Total failed: 0 / 871,757 - Big table PASSED 2.48s
1.4. Cryptographic routines:
- Adler32: 1 assertion passed 290us
- MD5: 1 assertion passed 187us
- SHA1: 5 assertions passed 187us
- SHA256: 5 assertions passed 91us
- AES256: 6,372 assertions passed 121.16ms
- Base64: 11,994 assertions passed 69.84ms
Total failed: 0 / 18,378 - Cryptographic routines PASSED 194.71ms
1.5. Compression:
- In memory compression: 12 assertions passed 315.31ms
- Gzip format: 19 assertions passed 612.19ms
- Zip format: 36 assertions passed 1.10s
- SynLZO: 3,006 assertions passed 63.48ms
- SynLZ: 3,006 assertions passed 78.12ms
Total failed: 0 / 6,079 - Compression PASSED 2.17s
1.6. Synopse PDF:
- TPdfDocument: 4 assertions passed 4.29ms
- TPdfDocumentGDI: 3 assertions passed 41.36ms
Total failed: 0 / 7 - Synopse PDF PASSED 46.75ms
2. mORMot
2.1. File based:
- Database direct access: 10,136 assertions passed 170.33ms
- Virtual table direct access: 12 assertions passed 2.64ms
- TSQLTableJSON: 19,030 assertions passed 25.96ms
- TSQLRestClientDB: 604,036 assertions passed 2.14s
Total failed: 0 / 633,214 - File based PASSED 2.34s
2.2. File based WAL:
- Database direct access: 10,136 assertions passed 149.64ms
- Virtual table direct access: 12 assertions passed 1.44ms
- TSQLTableJSON: 19,030 assertions passed 23.50ms
- TSQLRestClientDB: 604,036 assertions passed 2.11s
Total failed: 0 / 633,214 - File based WAL PASSED 2.29s
2.3. Memory based:
- Database direct access: 10,136 assertions passed 141.05ms
- Virtual table direct access: 12 assertions passed 1.38ms
- TSQLTableJSON: 19,030 assertions passed 22.33ms
- TSQLRestClientDB: 672,330 assertions passed 2.54s
Total failed: 0 / 701,508 - Memory based PASSED 2.71s
2.4. Basic classes:
- TSQLRecord: 52 assertions passed 283us
- TSQLRecordSigned: 200 assertions passed 4.71ms
- TSQLModel: 3 assertions passed 106us
Total failed: 0 / 255 - Basic classes PASSED 6.41ms
2.5. Client server access:
- TSQLHttpServer: 21 assertions passed 9.45ms
using THttpApiServer
- TSQLHttpClient: 3 assertions passed 22.92ms
- Http client keep alive: 3,084 assertions passed 201.33ms
4803 B, first 3.58ms, done 190.26ms i.e. 5255/s, aver. 190us, 24.5 MB/s
- Http client multi connect: 3,084 assertions passed 188.08ms
4803 B, first 399us, done 181.72ms i.e. 5502/s, aver. 181us, 25.7 MB/s
- Named pipe access: 3,086 assertions passed 534.92ms
4803 B, first 256.33ms, done 76.05ms i.e. 13149/s, aver. 76us, 61.4 MB/s
- Local window messages: 3,085 assertions passed 46.84ms
4803 B, first 93us, done 40.98ms i.e. 24402/s, aver. 40us, 114.0 MB/s
- Direct in process access: 3,053 assertions passed 36.90ms
4803 B, first 40us, done 36.03ms i.e. 27750/s, aver. 36us, 129.7 MB/s
Total failed: 0 / 15,416 - Client server access PASSED 1.04s
2.6. Service oriented architecture:
- Weak interfaces: 56 assertions passed 287us
- Service initialization: 129 assertions passed 1.83ms
- Direct call: 602,472 assertions passed 27.34ms
- Server side: 602,482 assertions passed 27.63ms
- Client side REST: 602,484 assertions passed 408.54ms
- Client side JSONRPC: 602,482 assertions passed 439.67ms
- Client side synchronized REST: 602,482 assertions passed 813.85ms
- Security: 135 assertions passed 1.01ms
- Custom record layout: 602,482 assertions passed 427.91ms
- Mocks and stubs: 30,031 assertions passed 49.06ms
Total failed: 0 / 3,645,235 - Service oriented architecture PASSED 2.20s
2.7. External database:
- External records: 1 assertion passed 1.05ms
- Auto adapt SQL: 186 assertions passed 16.80ms
- Crypted database: 176,192 assertions passed 167.08ms
- External via REST: 243,444 assertions passed 604.71ms
- External via virtual table: 243,444 assertions passed 1.10s
Total failed: 0 / 663,267 - External database PASSED 1.89s
Synopse framework used: 1.18
SQlite3 engine used: 3.7.10
Generated with: Delphi XE3 64 bit compiler
Time elapsed for all tests: 18.58s
Tests performed at 07/03/2013 16:03:09
Total assertions failed for all test suits: 0 / 10,510,680
! All tests passed successfully.
Done - Press ENTER to Exit
Note that the same tests run in less than 16 seconds when compiled in 32 bit - but with real server work, I do not think it would make a sensible difference.
Offline
Nice job!
64bit compiler is quite stable IME, but the 64bit debugger can be a bit more problematic (at least in XE2)
A lot of the 64bit RTL is quite less efficient, several fastcode routines and previously (old) well-thought out RTL asm routines were replaced by Pascal ones that suffer from a mix of poor implementation/algorithmic choices and compiler optimization limitations. So comparatively, the Synopse routines should be even more preferable in 64bit.
Offline
Under XE3, the 64 bit debugger did only break once a day (on average). So it was perfectly usable.
Compilation is much slower for Win64, but still usable, at least when re-building the whole mORMot units.
A lot of the 64bit RTL is quite less efficient, several fastcode routines and previously (old) well-thought out RTL asm routines were replaced by Pascal ones that suffer from a mix of poor implementation/algorithmic choices and compiler optimization limitations. So comparatively, the Synopse routines should be even more preferable in 64bit.
This is exactly what we have observed: by-passing the RTL is of some obvious benefit here!
As I wrote above: "Synopse core uses its own functions (e.g. for JSON serialization, RTTI support or interface calls or stubbing), so we were able to release the whole 64 bit power of your hardware".
Thanks for the feedback.
Offline
I just tried to compile 64-bit XE2 but an error occurs at compile time:
[DCC Error] mORMoti18n.pas(1025): E2116 Invalid combination of opcode and operands
Can you give me a hint?
Thanks corchi
Offline
I've made mORMoti18n.pas and SynTaskDialog.pas units compatible with Win64 platform.
Now the main SynFile demo is compiling and working as expected.
Including reporting (pdf export and gdi+ anti aliaising), toolbar auto-definition from TSQLModel, all task dialogs, etc...
Offline
sorry but I could test the new version (2013-03-11 21:19:08) only just now, and this is the error occurs at compile time:
[DCC Error] mORMotToolBar.pas(1088): E2064 Left side cannot be assigned to
Thank corchi
Offline
I just tried with Delphi 7 and XE3.
No problem for compiling the latest version.
Did you retrieve all versions?
I just posted an alternate syntax, perhaps Delphi XE2 compiler will prefer this.
I've seen that you must set Optimization=TRUE at compilation time, otherwise there are some potential issues when launching.
Offline
ok I have tested last version 2013-03-12 12:56:39 and it worked!!!
Thansk corchi
Offline
Pages: 1