Photo by Nick Fewings on Unsplash

Masumiyet Tuzağı-Enum ToString() Performance

Her developer Enum tipini en az bir kere kullanmıştır. Bu tip string görünümlü bir integer sabitidir. Değişkenlerin alabileceği değerlerin sabit(belli) olduğu durumlarda kodumuzun daha okunabilir olması için kullandığımız bu tip üzerinde bazen ToString() yöntemini kullanarak sayısal değerin karşılığı olan metinsel ifadeyi alabiliyoruz. Bu yazıda ToString() metodunu inceleyeceğiz. Enum değerler için nasıl çalıştığını analiz edeceğiz. Ek olarak Enum bir değerin metinsel ifadesini almanın farklı yollarını araştıracağız.

Car.cs

Car isimli bir enum tanımladık. İçerisinde araba markaları tutan bir sabit. Bu enum yazının sonuna kadar bizimle birlikte olacak.

Şimdi bu sabitin metinsel ifadesini alabileceğimiz yöntemleri inceleyelim.

Yöntem 1 : ToString() (😯)

Program.cs

İlk yöntemimiz klasik ToString() yöntemi. ToString() ile herhangi bir sabitin metinsel değerini alabiliriz.

Yöntem 2 : Generic Dictionary With Cache

Herhangi bir enum için çalışabilen ve cache mantığı ile GetAndSet yapabileceğimiz bir Dictionary yardımıyla metinsel değerlere ulaşabiliriz.

Program.cs

Yöntem 3 : Custom Dictionary With Cache

Tek bir enum için çalışabilen ve cache mantığı ile GetAndSet yapabileceğimiz bir Dictionary yardımıyla metinsel değerlere ulaşabiliriz.

Program.cs

Yöntem 4 : Array With Cache

static olarak enum bir array olarak tanımlanır ve her metinsel ifade istenildiğinde bu array üzerinden okunur.

Program.cs

Yöntem 5 : Switch

Hard-Code bir şekilde enum değerlerini tanımlayarak metinsel değerlere sahip olabiliriz.

Program.cs

Tüm çözümleri tek bir noktada toplayalım.

BenchmarkDotnet kütüphanesi ile her bir çözümü inceleyelim ve masum görünen kodlarımızın maskelerini düşürelim.

Results

ToString() bu yöntemler arasında en kötü performansa sahip olan yöntem. Ayrıca Memory Allocation tarafında da diğer yöntemlere kıyasla oldukça geride. Buradaki birimler çok küçük bu sebeple çok fazla dikkate almayabilirsiniz. ToString() ile bir enum sabitinin metinsel karşılığını almak oldukça pahalı bir işlem gibi görünüyor. Genel olarak performans etkisi ihmal edilebilir durumdadır. Ancak ToString() yöntemini saniyede binlerce kez çağırdınızda birkaç milisaniyeyi kaybettiğinizi unutmamalısınız.

ToString() dışındaki diğer yöntemler çok aptalca gözükebilir. Bir sabitin metinsel karşılığını almak için bu kadar kod yazmak mantıklı mı? Özellikle switch-case olarak sonuç aldığımız yöntem oldukça okunabilirliği azaltıyor. Burada odaklanmak istediğim konu kullandığımız basit yöntemlerin aslında arka tarafta hangi işlemleri yaptığı ve bize nasıl bir yük oluşturduğunu gözlemlemek.

Buraya kadar yöntemleri birbirleri ile kıyasladık. Peki ToString() neden bu kadar kötü? 🤔

ToString() yönteminden derinlere doğru inildiğinde enum sabitleri için bir BinarySearch algoritmasının çalıştığını görüyoruz.

İşte şimdi taşlar yerine oturmaya başladı. Binary Search zaman karmaşıklığı(time complexity) olarak O(logn) değerine sahiptir.

Array veya switch-case gibi yöntemler ise O(1) ile çalışır. Artık bu performans kaybının nereden ve nasıl oluştuğunu matematiksel olarak ispatlamış olduk.

Kullandığımız teknolojinin arkasında bulunan algoritmaları, nasıl çalıştığını bilmek kıyamet senaryolarında hayatımızı kurtarabilir. Her zaman olduğu gibi bu konuda da benzer bir durum var.

ToString() yöntemi tüm yöntemler arasında en okunaklı ve code complexity bakımından en doğru olan yöntem. Diğerleri ise bizim kod yazmamızı ve okunabilirliği azaltmamız durumunda performans kazandıran yöntemler. Karar sizin.

Yazdığınız kodlar production ortamında hatasız çalışsın. Testler sizi korusun. 🙏

Getting started | BenchmarkDotNet

Introduction to Big O Notation. Getting started with Big O Notation… | by Andrew Jamieson | Towards Data Science

Enum.ToString is slower than explicit implementation · Issue #57748 · dotnet/runtime (github.com)

Performance: Enum ToString or GetName — CodeProject

Enum ToString(), Caching for Performance | no dogma blog (bryanhogan.net)

--

--

Medium independent DevOps publication. Join thousands of aspiring developers and DevOps enthusiasts

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Furkan Güngör

Furkan Güngör

887 Followers

Solution Developer — I want to change the world, give me the source code.