Improve the OOP ABI

Hipreme msnmancini at hotmail.com
Mon Jan 22 14:22:33 UTC 2024


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 :)




More information about the Digitalmars-d mailing list