Özel Kod Üretimi
Özel Kod Üretimi
Bazen bir sınıfın mümkün olan en iyi performansı göstermesi gerekir. Bazı algoritmalar için, bir soruna genel bir çözüm yazmak kolaydır, ancak genel çözümün ek yükü istenmeyebilir. Soruna özel bir çözüm mümkün olabilir, ancak sorunun ayrıntıları çalışma zamanına kadar bilinmediğinden önceden üretilemez.
Bu gibi durumlarda, yürütme zamanında özel çözümü oluşturmak yararlı olabilir. Bu teknik genellikle kendi kendini değiştiren kod olarak bilinir.
Bu alıştırmadaki ilk adım, problemin basit genel çözümünü yazmaktır. Birkaç çözüm bulunacağından, bir çerçeve oluşturmak birkaç dosya alacaktır. İlki, zamanlama yapmak için bir yardımcı program sınıfıdır.
Counter sınıfı, Win32 performans sayacı işlevlerini kapsar ve doğru zamanlamalar elde etmek için kullanılabilir. .NET 2.0, Win32 performans sayacının işlevselliğini tamamlayan Stopwatch adlı yeni bir sınıf sunar.
Bir uygulama kesin zaman işlevselliği gerektiriyorsa ve eski çerçeve sürümleri için destek gerektirmiyorsa, Stopwatch’ı Counter sınıfı üzerinden kullanmalısınız.
Bu, polinomu terim terim dolaşan, değerleri toplayan ve sonucu döndüren basit bir değerlendiricidir. TimeEvaluate() işlevi, Polynomial’dan türetilen bir sınıfı alır ve değerlendirme yapmak üzere IPolynomial arabirimini elde etmek için GetEvaluate()’i çağırır. Başlatma ek yükünü belirlemek için GetEvaluate() işlevini zamanlar ve ardından değerlendirme işlevini 100.000 kez çağırır.
Sürücü 1, 7 ve 50 katsayılı polinomları değerlendirir ve zamanlama bilgilerini yazar. İlk çalıştırma sonuçları oluşturur. (değerlendirme/saniye olarak sayılanlar). Bu sonuçlar gerçekten oldukça iyi, ancak özel bir çözümün daha iyisini yapıp yapamayacağını görmek ilginç olacak.
Özel Bir C# Sınıfı
Genel çözümün bir miktar ek yükü var ve bundan kurtulmak güzel olurdu. Bunu yapmak için, bir ifadeyi doğrudan değerlendiren bir eval sürümüne ihtiyacınız var. Bu örnek, polinomu tek bir ifadede değerlendiren bir sınıf üretecektir.
Bir polinom ilk kez değerlendirildiğinde, WriteCode() işlevi kodu dosyaya yazar ve derler. Ardından, derlemeyi yüklemek için Assembly.LoadFrom()’u ve sınıfın bir örneğini oluşturmak için Activator.CreateInstance()’ı kullanır. Örnek ve tür daha sonra kullanılmak üzere saklanır.
İşlevi çağırma zamanı geldiğinde, x’in değeri bir diziye konur ve işlevi bulmak ve çağırmak için Type.InvokeMember() kullanılır.
Bu sürüm çağrıldığında, gösterilen sonuçları üretir.
Bunlar tam olarak istediğiniz sonuçlar değil. Sorun şu ki, Type.MethodInvoke() genel bir işlevdir ve yapacak çok şeyi vardır. Adı ve parametreleri temel alarak işlevi bulması ve diğer işlemleri gerçekleştirmesi gerekir ve bunu işlev her çağrıldığında da yapar.
İhtiyaç duyulan şey, ek yük olmadan çağrıyı gerçekleştirmenin bir yoludur – başka bir deyişle, yöntemin hangi sınıfta olduğunu tanımlamadan bir yöntemin nasıl görüneceğini tanımlamanın bir yoludur. Bu, bir arayüzün mükemmel bir açıklamasıdır.
Önceki örnekte olduğu gibi değerlendirme işlevini doğrudan çağırmak yerine, özel sınıfın arabirimi uygulaması için kodu değiştirebilirsiniz. Derleme yüklendikten ve sınıfın bir örneği oluşturulduktan sonra, arabirime aktarılacak ve bu arabirim sürücü programına da döndürülecektir.
QR kod düzenleme
Kişiye özel karekod oluşturma
QR kod telefon numarası
QR kod ile siteye yönlendirme
Sınırsız süreli QR kod
Harita QR kod
Qr kod nasıl üretilir
Qr kod çizimi
Bu yaklaşımın iki faydası vardır. İlk olarak, doğrudan arabirim aracılığıyla arama yapacaksınız, böylece Type.InvokeMember() ek yükünden kaçınacaksınız. İkinci olarak, daha sonra özel işlev olarak adlandırılan sınıf değerlendirme işlevini çağıran sürücü yerine, sürücü doğrudan özel işlevi çağıracaktır. Bu örneği denediğinizde, gösterilen sonuçları da alırsınız.
Bu, küçük polinomlar için güzel bir performans artışı sağlar. Bununla birlikte, büyük olanlar için, işlevin önbelleğe sığmayacak kadar büyük olduğu ve bu nedenle basit yöntemden daha yavaş olduğu ortaya çıktı. Ancak bunun bir sorunu da var.
Dosyayı yazmak, derlemek ve ortaya çıkan derlemede okumak için yaklaşık yarım saniyelik bir ek yük vardır. Her polinom birçok kez değerlendirilirse sorun değil, her biri yalnızca birkaç kez değerlendirilirse sorun da değildir.
Ayrıca, bu teknik C# kodunu içerdiğinden, derleyicinin kodun yürütüldüğü sistemde bulunması gerekir. Uygulamanın nerede çalışacağına bağlı olarak bu bir sorun olabilir. İhtiyaç duyulan şey, ek yükten ve C# derleyicisine bağımlılıktan kurtulmanın da önemli bir yoludur.
.NET Framework belgelerinde yapılan bir gezi, CodeDOM olarak adlandırılan bir dizi sınıfı gösterir. Visual Studio .NET tasarımcıları, Windows Formları ve Web Formları için kod yazmak üzere CodeDOM’u da kullanır.
Reflection.Emit Uygulaması
Belgelerde biraz daha araştırma yaparak, Reflection.Emit ad alanına rastlayabilirsiniz. Bu ad alanındaki sınıfları kullanarak, bellekte sınıflar oluşturmak ve doğrudan işlevler için IL’yi yazmak mümkündür.
Reflection.Emit’i kullanmak oldukça zordur çünkü işlevler C# yerine IL dilinde yazılır. .NET IL, x86 derleme dilinden biraz daha basit olsa da, IL’yi derleme dili olarak geliştirmek de oldukça kabaca zordur. SDK ile birlikte gelen IL referans kılavuzu faydalı bir referans olacaktır.
Hangi IL’nin üretileceğini belirlemenin en kolay yolu, sınıfı C# dilinde yazmak, derlemek ve ardından hangi IL’nin üretileceğini bulmak için ILDASM’yi kullanmaktır. Polinom ifadesini değerlendirmek için C# derleyicisi normal bir model kullanır, bu nedenle IL’yi oluşturmak da kolaydır.
Bu kodu anlamanın en iyi yolu, önceki örnek için ILDASM’ye bakmak, kodu gözden geçirmek, belgelerdeki sınıflara bakmak ve yorumları okumaktır.
Reflection.Emit kullanan uygulama, diğer hızlı tekniklerle hemen hemen aynı performansa sahiptir, ancak daha az ek yüke sahiptir (ilk polinom için yaklaşık 0,25 saniye ve sonraki polinomlar için ölçülebilir ek yük de yoktur).
Web sitelerinizi, arama motorlarında en yukarı getirmek adına sizlere 3 adet paket öneriyoruz. Bu paketler sayesinde web siteleriniz aramalarda 1 yıl içerisinde en yukarıya tırmanacaktır.
1) Backlink Paketi 50 $ (Yıllık Ücret)
2) Hızlandırma Paketi 300 $ (Yıllık Ücret)
3) Kelime Yönlendirme Paketi 150 $ (Aylık Ücret)