Daniel Murphy:
> Maybe different hash functions are used?
I presume that something somewhere uses some different function of a different
part of it, but then one of those functions has a significant amount of space
left for improvement.
The __Dmain produced by the two versions of the program are exactly the same,
minus some names, they call the same runtime functions like __aaInX and the
other functions too visible with obj2asm are the same.
---------------
Alex R. Petersen:
> With an enum, I assume the hashes can be precomputed.
This program doesn't use enum/chars but dynamic array of enums/chars, so you
can't precompute (it uses only 500 different strings, so again it can
precompute the hash of them all, but this just forces me to create a more
complex benchmark).
Regarding hashing of single enums, often enough (from ObjectPascal usage) I'd
like to use arrays with a small group of named indexes. D allows you to write
this, but it defines an associative array, this is a waste of memory and
performance:
enum Foo : size_t { A, B, C, D }
void main() {
int[Foo] array;
array[Foo.D] = 5;
// array[2] = 1; // statically rejected
}
This alternative code works, but you lose all strong static typing:
enum : size_t { A, B, C, D }
void main() {
int[4] array;
array[D] = 5;
array[2] = 1; // accepted
}
Bye,
bearophile