Tag Archives: lowering

Switch içerisinde Hash Table optimizasyonu [C#]

C# compiler’ının switch statement’ı içerisinde 7. case’den sonra bir hash table optimizasyonu yaptığını biliyor muydunuz?

C# compiler’ı switch statement‘ını 6 tane case sayısına ulaşana kadar lowering mekanizması ile standart if else ifadelerine çeviriyor.

Fakat case sayısı 7’ye ulaştığında lowering mekanizması akıllıca bir optimizasyona gidiyor. Bu, C# compiler’ın işini zamanında yapmasını sağlayan çok akıllı bir optimizasyon. Bu optimizasyon, aynı string’lerin hash code’larının aynı olması gerektiği gözlemine dayanıyor. Bu yüzden string’leri teker teker eşitliğini kontrol etmek yerine, compiler hedef string’in bir hash’ini hesaplıyor table-lookup mantığında çalışmasını sağlıyor yani O(1) zamanda.

Bu Roslyn’in github sayfasında şöyle bahsedilmiş:

The string switch codegen in Roslyn is completely new. Roslyn does not use dictionaries to avoid allocations and a potentially huge penalty when a string switch is execute for the first time. Roslyn uses a private function that maps strings to hash codes and a numeric switch. In some sense this is a partial inlining of the former technic that used static dictionaries.

Kaynaklar:

https://sharplab.io/#v2:EYLgtghglgdgPgAQEwEYCwAoBBmABM3AYVwG9NcL89YAXXAWQAoEUAGXAZwEpdzKyMlIZwDuUGgGMAFo259hpeQsoSIHAKa4ARBC0h8AdlwoA3EuW5VG7cD2HcSM4Isq1mrRLsIj2Jy9fWWgAmXkYALH7+lm7a6qG4AKyR/lbuAGbxAGzJLqnaAObxBjkWQeppEACuADY0+t64ALSm5pQAvkodGG1AA=

https://en.wikipedia.org/wiki/Switch_statement#Advantages_and_disadvantages

https://github.com/dotnet/roslyn/blob/main/src/Compilers/CSharp/Portable/Compiler/MethodBodySynthesizer.Lowered.cs