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

Reply via email to