Improve the OOP ABI

ryuukk_ ryuukk.dev at gmail.com
Mon Jan 22 15:46:02 UTC 2024


On Monday, 22 January 2024 at 14:22:33 UTC, Hipreme wrote:
> On Monday, 22 January 2024 at 13:48:20 UTC, Andrea Fontana 
> wrote:
>> On Monday, 22 January 2024 at 13:47:34 UTC, Andrea Fontana 
>> wrote:
>>> On Monday, 22 January 2024 at 10:23:55 UTC, ryuukk_ wrote:
>>>> On Monday, 22 January 2024 at 10:08:16 UTC, Andrea Fontana 
>>>> wrote:
>>>>> On Sunday, 14 January 2024 at 09:04:32 UTC, Walter Bright 
>>>>> wrote:
>>>>>> On 9/28/2023 5:42 AM, deadalnix wrote:
>>>>>>> 1/ Downcast to final classes.
>>>>>>
>>>>>> This has a PR for it now.
>>>>>>
>>>>>> https://github.com/dlang/dmd/pull/16032
>>>>>
>>>>> Why md5 and not a faster method?
>>>>>
>>>>> Andrea
>>>>
>>>> That is good opportunity to submit a PR, try it, it's not 
>>>> that hard and is rewarding
>>>
>>> I know: I've already submitted PR to dmd and phobos :)
>>>
>>> For example, this one. Easy, fast, insecure (who cares, in 
>>> this case).
>>> http://www.isthe.com/chongo/tech/comp/fnv/
>>>
>>> Andrea
>>
>> The right one is FNV-1a:
>> http://www.isthe.com/chongo/src/fnv/hash_32a.c
>
>
> FNV1A is used for `hashOf`. HashOf seems to be a lot faster 
> than md5 only when you're dealing with smaller strings. I've 
> done a test online and you'll see, this won't do actual 
> difference in compilation time:
>
> ```d
> import std;
>
>     auto test(T)(scope T delegate() dg)
>     {
>         import std.datetime.stopwatch;
>         StopWatch sw = StopWatch(AutoStart.yes);
>         scope(exit){writeln(sw.peek.total!"msecs");}
>         return dg();
>     }
>
>     string repeat(string a, int n)
>     {
>         char[] ret = new char[](a.length*n);
>         foreach(i; 0..n)
>             ret[i*a.length..(i+1)*a.length] = a[];
>         return cast(string)ret;
>     }
>     void main()
>     {
>         import std.digest.md;
>
>         foreach(count; [1, 5, 10, 15, 25, 35, 50, 100, 200])
>         {
>         	string testString = "a".repeat(count);
>
>             writeln("\nResult for 1_000_000 times executing 
> hashes for a string if size ", count);
>             test(()
>                  {
>                      foreach(i; 0..1_000_000)
>                          hashOf(testString);
>                  });
>             test(()
>                  {
>                      foreach(i; 0..1_000_000)
>                          md5Of(testString);
>                  });
>         }
>     }
> ```
>
> This is the result I have for this program:
>
> ```
> Result for 1_000_000 times executing hashes for a string if 
> size 1
> 12
> 130
>
> Result for 1_000_000 times executing hashes for a string if 
> size 5
> 25
> 132
>
> Result for 1_000_000 times executing hashes for a string if 
> size 10
> 36
> 129
>
> Result for 1_000_000 times executing hashes for a string if 
> size 15
> 41
> 124
>
> Result for 1_000_000 times executing hashes for a string if 
> size 25
> 54
> 127
>
> Result for 1_000_000 times executing hashes for a string if 
> size 35
> 69
> 120
>
> Result for 1_000_000 times executing hashes for a string if 
> size 50
> 94
> 116
>
> Result for 1_000_000 times executing hashes for a string if 
> size 100
> 176
> 217
>
> Result for 1_000_000 times executing hashes for a string if 
> size 200
> 379
> 394
> ```
>
> As you see, this is a result for 1 million times hashing 
> strings. I can't even think in many situations people would be 
> doing 1 million time hashings. For a big program, you'll 
> probably get 200 string literals. And if you test, it is still 
> 0 milliseconds. So, MD5 is a pretty solution for that problem, 
> and this would be too much effort for actually no gain at all, 
> it could even create duplicate strings for no millisecond gain 
> :)

It hashes class name, they'll probably never be more than 30 
characters, so md5 in your example would be 2x slower

I think it worth doing more benchmarks, even few milliseconds 
gained is worthwhile, that's milliseconds you could spend doing 
more template work for example, it's additive


More information about the Digitalmars-d mailing list