Help optimize D solution to phone encoding problem: extremely slow performace.

ryuukk_ ryuukk.dev at gmail.com
Fri Jan 19 20:05:07 UTC 2024


On Friday, 19 January 2024 at 17:18:36 UTC, evilrat wrote:
> On Friday, 19 January 2024 at 16:55:25 UTC, ryuukk_ wrote:
>>
>> You do hash map lookup for every character in D, it's slow, 
>> whereas in Rust you do it via pattern matching, java does the 
>> same, pattern matching
>>
>>
>> Yet another reason to advocate for pattern matching in D and 
>> switch as expression
>
> There is another important difference, i quickly looked up D 
> associative array implementation and the search looks like 
> nlog(n) complexity with plain loop iteration of hashes, whereas 
> rust's implementation is using "swisstable" algorithm 
> implementation that has packed SIMD optimized lookups, this is 
> likely where the 3x speed difference comes from.
>
> Tried to look up rust implementation and it is SOOO generic 
> that I was unable to decipher it to find the actual key search 
> and stores.
>
> Anyway here is an interesting article about rust implementation
> https://faultlore.com/blah/hashbrown-tldr/

I'm not talking about the difference between the hashmap 
implementation, but the difference between the algorithm used to 
lookup the characters

https://github.com/renatoathaydes/prechelt-phone-number-encoding/blob/9b1d7f026943841638a2729922cf000b1b3ce655/src/java/Main2.java#L106-L134

vs

https://github.com/renatoathaydes/prechelt-phone-number-encoding/blob/40cd423fc9dd1b1b47f02d8ab66ca03420820e84/src/d/src/dencoder.d#L10-L49


If D had pattern matching and switch as expression, the faster 
method would be:

1. the most obvious choice

2. the fastest by default

3. the most clean

To save from having to write a old-school verbose `switch`, i 
suspect he went with a hashmap, wich is slower in that case, 
hence why i keep advocate for that feature, or i should say, that 
upgrade to `switch`, wich java has adopted, as well as rust:

https://github.com/renatoathaydes/prechelt-phone-number-encoding/blob/40cd423fc9dd1b1b47f02d8ab66ca03420820e84/src/rust/phone_encoder/src/main.rs#L146-L168




More information about the Digitalmars-d-learn mailing list