Skip to content

Latest commit

 

History

History
378 lines (271 loc) · 35.5 KB

File metadata and controls

378 lines (271 loc) · 35.5 KB

Kod Optimizasyon Yöntemleri

Çeşitli kod optimizasyon yöntemlerinden oluşan derleme

Çeviriler

İçindekiler

Algoritmaların Hesaplama Karmaşıklığı Teorisi ve Kod Optimizasyon Teknikleri arasındaki ilişkiye dair bir not

Hesaplama Karmaşıklığı Teorisi 2 ve kod optimizasyon teknikleri 1 ortak bir amaç olarak verimli problem çözmeyi hedeflerler. Birbirileri ile ortak paydaları olmasına ve aynı bağlamı paylaşmalarına rağmen, aralarındaki fark vurgu yaptıkları konulardadır.

Hesaplama karmaşıklığı teorisi performansı girdi boyutu göre araştırır. Alt yatan mimariden bağımsız olarak girdi boyutuna en az bağımlı ve en hızlı algoritmik çözümü tasarlamaya çalışır. Kod optimizasyon teknikleri ise mimariye ve hesaplama karmaşıklığı teorisinin tahminlemede kullandığı belli sabitlere odaklanır.

Gerçek zamanlı çalışan sistemlerde bu ikisi de kritik faktör olabilir (Örneğin, JavaScript ile Gerçek Zamanlı Resim İşleme Processing kütüphanesi, evet ben yazdım :) ).

Genel Prensipler

  • DRY Prensibi ve Önbellek : Genel önbellekleme kavramı, gerekli değilse bir sonucun yeniden hesaplanmasından / yeniden yüklenmesinden kaçınmayı içerir. Bu DRY prensibinin 3 farklı bir çeşidi olarak da görülebilir. Ara sonuçları saklayıp tekrar hesaplama zaman ve kaynak tasarrufu sağlandığından dinamik programlama da önbelleklemenin bir çeşidi gibi görülebilir.

  • KISS, sade olan daha hızlı olabilir : 'Keep it simple' 4 prensibi, bir çok tekniği uygulanabilir ve değiştirilebilir hale getirir. ( Bu konuda yardımcı olabilecek çok fazla yazılım mühendisliği tekniği vardır 34, 35, 55, 56 )

  • Tek rardüzen lersenda hakolayola bilir, tekrar düzenlersen daha kolay olabilir : İhtiyaç duyduğunuz an yeniden düzenleme yapmaktan çekinmeyin. Çoğu zaman bir şey var olan özellikleri korunarak daha hızlı ve basit bir yapıya sahip olacak şekilde tekrar düzenlenebilir ve yeniden yapılandırılabilir (denkşekillilik kavramı 22 , temsil değişikliği 23, 24, 36 ), ve bu durum beraberinde başka faydalar da getirir. Örneğin, the bu sayısal ifade (10+5*2)^2 aslında 400 sabitine eşittir, bir başka örnek ise infix ifade notasyonundan daha hızlı ayrıştırılabilen prefix (Polish) notasyonuna olan dönüşümdür.

  • Alt problemlere Böl ve çözümü Fethet : Alt problemler (küçük, önemsiz ve özel parçalar) daha kolayca ve hızlıca çözülerek büyük çözüme ulaşılabilir. Sıralama algoritmaları buna en güzel örneklerdir 5, sıralama algoritmaları .

  • Yardım istemekten çekinme : Mümkünse iş yükünü dağıtın, daha küçük parçalara bölüm, paylaşın ve paralel olarak yapılabilmesini sağlayın 6, 54, 68, 69, 70 .

  • United we Stand and Deliver : Veriyi farklı kaynaklarda dağınık halde değil de tek ve bitişik bir kaynaktan alma, yüklemeyi ve küçük parçalar halinde okumak yerine tek parça halinde işlemeyi hızlı hale getirir (ör. önbellek, vector/pipeline, veritabanı sorguları) 51, 52, 53 .

  • Biraz tembellik etmek çok da kötü bir şey değildir : Kesinlikle söyleyebiliriz ki, bir program her çalıştırıldığında, verilerinin ve işlevlerinin yalnızca bir kısmı kullanılır. Sadece gerektiğinde bütün veriyi ve özellikleri yükleme ya da çalıştırma (tembel olma) daha uzun bir yol almamızı sağlayabilir 7 .

Ek Notlar

Optimizasyona başlamadan önce neyin optimizasyona ihtiyaç duyduğunu belirleyip hesaplamak gerekir. Hiç optimizasyon yapmamak kör "optimizasyondan" çoğunlukla iyidir.

Bununla beraber, kişi daima verimli çözümler üretmeye ve optimize etmeye çalışmalı. Verimli olmayan "çözümler" en fazla çözümsüz durum kadar iyi olabilir, o da tabi kötü değillerse.

Eksik optimizasyon ancak eksik bilgi ile geçerli görülebilir. Örneğin, bütün bir class yada array yüklemek aynı bilgi ile sadece bir integer dönmekten daha yavaştır.

Bazı optimizasyon teknikleri otomatikleştiriebilir (örneğin derleyicilerde) ama çoğunluğun elle yapılması gerekir.

Bazen hafıza/zaman kaynakları arasında bir takas dengesi vardır. Hızı artırmak hafıza/alan ihtiyacını artırabilir (caching buna en güzel örnektir).

90-10 (80-20 veya diğer varyasyonlar) kuralına göre diyebiliriz ki kodun çalışması için harcanan zamanın 90% kısmı yazılan kodun 10% kısmı (örneğin bir döngü) tarafından kullanılır. Bu kısımda yapılan bir optimizasyonun etkisi çok büyük olacaktır. (Örnek olarak Knuth'a bakabilirsiniz 8 )

Bir optimizasyon yöntemi (örneğin sadeleştirme) diğer bir yöntemin (örneğin sabit değiştirme) uygulanmasına yol açabilir ve bu da bir zincir şeklinde birinci yöntemin (ya da başka bir yöntemlerin) uygulanmasına yol açabilir. Kapı kapıyı açar.

Referanslar: 9, 11, 12, 46, 47, 48, 49, 50

Alt-seviye

Genel Konular 44, 45

Veri Kaydetme

  • Disk erişimi yavaştır (Ağ üzerinden erişim daha da yavaştır)
  • Hafızaya (RAM) erişim diske erişimden daha hızlıdır
  • CPU Cache Hafızası (eğer varsa) ana hafızadan daha hızlıdır
  • CPU kayıtları en hızlısıdır

İkili (Binary) Formatlar

  • Double kesirli sayı aritmetiği yavaştır
  • Float kesirli sayı aritmetiği double kesirli sayı aritmetiğinden daha hızlıdır
  • Büyük tamsayı (long integer) aritmetiği float kesirli sayı aritmetiğinden daha hızlıdır
  • Küçük tamsayı (short integer), sabit noktalı aritmetik büyük tamsayı aritmetiğinden daha hızlıdır
  • Bit temelli aritmetik en hızlısıdır

Aritmetik İşlemler

  • Üslü işlemler yavaştır
  • Bölme işlemi üslü işlemlerden daha hızlıdır
  • Çarpma işlemi bölme işleminden daha hızlıdır
  • Toplama ve çıkarma işlemleri çarpma işleminden daha hızlıdırlar
  • Bit işlemleri en hızlısıdır

Metodlar

  • CPU veri yuvası kullanımı : Veri yuvası hafızası çok kullanılan verilere ulaşmak için en hızlı erişim yöntemi olduğu için optimum bir mantıkla yüklü işlemler sırasında veri yuvalarında veri saklamak uygun bir yoldur (örneğin derleyiciler, gerçek zamanlı sistemler). Bu tarz optimizasyona imkan veren farklı algoritmalar (gafik reklendirme problemini temel alan) vardır. Başka bir yöntem olarak da programcı yapılan işlemin bir bölümünde CPU veri yuvalarında saklanan değişkenleri tanımlayabilir 10

  • Tekil Atom Optimizasyonu : Bu atom olarak adlandırılan bir tek CPU işleminin optimizasyonun içeren farklı işlemleri kapsıyor. Örneğin bir atomun içindeki bazı işlenenler değişken kullanmak yerine sabit sayılara çevirilebilir. Başka bir örnek ise bir sayının karesini hesaplarken üslü sayı (code1}2) kullanmak yerine çarpma işlemi kullanmaktır, vs

  • Atom Grupları Optimizasyonu : Bir önceki başlığa benzer olarak, bu optimizasyon türünde atom ve atom gruplarının kontrol akışı incelenir, işlemlerin amacı korunarak tekrar düzenlenmesi ve daha az komut kullanılması sağlanmaya çalışılır. Örneğin, karmaşık bir IF THEN akışı incelenerek basit bir Jump cümlesine çevrilebilir, vs.

Dil tabanlı optimizasyon

  • Dilin sunduğu özellikleri sağlamak için kullandığı alta yatan mekanizmaları anlamak için resmi belgelerini ve el kitabını dikkatlice okumak ve kod yazarken ya da alternatifler üretirken bunu kullanmak lazım.

Dile bağımlı optimizasyon

  • İfadelerin yeniden düzenlenmesi : Bir ifadenin (veya bir işlemin hesaplanmasının) hesaplanması için daha verimli kod, ifadede gerçekleşen işlemleri farklı bir sırayla işleyerek üretilebilir. Bunun nedeni, ifadelerin / işlemlerin yeniden düzenlenmesi, eklenen ve çarpma sayısı ve dolayısıyla her bir işlemin (toplam) göreceli (hesaplamalı) maliyetleri de dahil olmak üzere, neyin eklenip neyin çarpılarak değiştirileceğidir. Aslında, bu aritmetik işlemlerle sınırlı değildir, fakat simetrileri kullanan herhangi bir işlem (örn. Değişmeli yasalar, birleşme yasaları ve dağıtım yasaları, gerçekte ellerinde bulundukları zaman, gerçekte aritmetik operatör simetrilerinin örnekleridir) ve işlemcilerin yeniden düzenlenmesidir ve aynı zamanda diğer avantajlara sahiptir. Bu durum karmaşık cümlelerin aksine aslında çok basittir. Daha iyi anlamak için bu örneklere bakabilirsiniz; Horner Yasası 13 , Karatsuba Çarpımı 14 , hızlı karmaşık çarpım 15 , hızlı matris çarpımı 18, hızlı üs hesaplama 16, 17 , hızlı gcd işlemi 78 , hızlı faktöriyel/binom açılımı 20 , hızlı fourier çevirimi 57 , hızlı fibonacci sayısı hesaplama 76 , birleştirerek sıralama 25 , üsleri kullanarak sıralama 26 .

  • Sabit Yer Değiştirme/Üretme : Çoğu zaman bir ifade tüm durumlarda tek bir sabit olarak hesaplanıyor olabilir, daha karmaşık ve daha yavaş ifade yerine sabit değer ile yer değiştirebilir (bazen derleyiciler bunu yapar).

  • ** Fonksiyon/Rutin Satır İçini Çağırma** : Bir fonksiyonu ya da rutini çağırma program durumunu yığının bir başka bölümne taşıma ve geri getirme gibi cpu'nun yapması gereken birçok işlem gerektirir. Bu yüklü işlemler yapılırken oldukça yavaş olabilir ve fonksiyonların gövdelerini kullanmak daha hızlı olabilir. Bazen bunu derleyiciler yapar, bazen de bunu bir programcı fonksiyon ya da rutin gövdelerini direk (inline ) kullanarak yapabilir. 27

  • Akış Geçişlerini Birleştirme : IF/THEN talimatları ve mantığı, özünde cpu dalı talimatlarıdır. CPU dal talimatları, program işaretçisinin değiştirilmesini ve yeni bir yere gitmesini içerir. Çok fazla jump talimatı içerirmesi durumunda bu çok yavaş olabilir.Bununla birlikte, IF/THEN ifadelerinin yeniden düzenlenmesi (ortak kodu çarpanlara ayırmak, De Morgan'ın mantık sadeleştirme kurallarını kullanarak vb.) verimli ve daha az mantıksal karmaşıklık içeren daha izomorfik işlevlere sebep olur ve sonuç olarak daha az ve daha verimli dalı talimatları oluşur.

  • Ölü Kod Eleme : Çoğu zaman derleyiciler, asla erişilmeyen bir kodu belirleyebilir ve derlenmiş programdan kaldırabilir. Ancak tüm vakalar tespit edilememektedir. Önceki sadeleştirme şemalarını kullanarak, programcı "ölü kodu" (asla erişilmez) daha kolay belirleyebilir ve kaldırabilir. "Ölü kod elemesine" alternatif bir yaklaşım "canlı kod ekleme" veya "ağaç sallama" teknikleridir.

  • Ortak Alt İfadeler : Bu optimizasyon, kodun çeşitli bölümlerinde ortak olan alt ifadelerin tanımlanmasını, yalnızca bir kez değerlendirilmesini ve değerinin sonraki tüm yerlerde kullanmasını içerir (bazen derleyiciler bunu yapar).

  • Ortak Kodu Ayrıştırma : Çoğu zaman aynı kod bloğu farklı dallarda bulunur, örneğin program bazı ortak işlevler ve ardından bazı parametrelere bağlı olarak başka bir şey yapmak zorundadır. Bu ortak kod dallardan ayrılabilir ve böylece gereksiz fazlalık, gecikme ve büyüklüğü ortadan kaldırabilir.

  • Mukavemet Azaltma : Bu, bir işlemin (örneğin bir ifadenin) daha hızlı olan bir eşdeğerine dönüştürülmesini içerir. Buna en genel iki örnek üslü işlem'i çarpma ile ve çarpma'yı toplama ile (örneğin bir döngü içinde) değiştirmektir. Bu tekniği uygulama, daha basit ancak eşdeğer işlemlerin, daha karmaşık eşdeğerlerinden (genellikle yazılımda uygulanan) daha hızlı (genellikle donanımda uygulanır) işlemci çevrimi içermesi gerçeğinden kaynaklanan verimlilik artışı ile sonuçlanabilir 28.

  • Küçük/Özel Durumları Ele Almak : Bazen karmaşık bir hesaplamanın daha basit/sade işlem türleriyle hesaplanabilecek daha küçük ya da özel durumları olabilir(örneğin, a^b hesaplaması, daha basit bir yöntemle a,b=0,1,2 için özel durumları ele alınabilir). Önemsiz durumlar uygulamalarda bazı sıklıklarla ortaya çıkar, bu nedenle basitleştirilmiş özel durumlar kodda oldukça yararlı olabilir. 42, 43 .

  • Matematiksel Teoremleri/İlişkileri Kullanma : Bazen bir hesaplama herhangi bir matematik teoremini, çevrimini, simetrisini 24 ya da bilgisini kullanarak doğru ve daha verimli bir şekilde yapılabilir (Örneğin, lineer denklem sistemlerini çözmek için Gauss metodu 58 , Euclid Algoritması 71 , ya da ikisi 72 , Fast Fourier Çevirimi 57 , Fermat'ın Küçük Teorisi 59 , Taylor-Mclaurin Serileri Açılımı, Trigonometrik Bilgiler 60 , Newton'un Metodu 73,74 , v.s. 75 ).

  • Verimli Veri Yapılarını Kullanmak : Veri yapıları, algoritmaların karşılığıdır (tüm kapama alanındaki), her verimli algoritma, belirli bir görev için ilişkili bir verimli veri yapısına ihtiyaç duyar. Birçok durumda uygun bir veri yapısı (gösterimi) kullanmak tüm farkı oluşturabilir (örneğin; veritabanı tasarımcıları ve arama motoru geliştiricileri bunu çok iyi bilir) 36, 37, 23, 62, 63, 64, 65, 68, 69, 70, 77 .

Döngü Optimizasyonu

Belki de en önemli kod optimizasyon teknikleri, döngü içeren tekniklerdir.

  • ** Kod Hareketi / Döngü Değişmezleri ** : Bazen döngünün içindeki bir kod bölümü döngü indeksinden bağımsızdır, döngü dışına alınabilir ve sadece bir kere çalıştırılabilir (bu bir döngü değişmezidir). Böylelikle döngü daha az işlem yapar (bazen derleyiciler bunu yapar) 29, 30

örnek:

// bu döngü geliştirilebilir
for (i=0; i<1000; i++)
{
    invariant = 100*b[0]+15; // bu bir döngü değişmezidir çünkü döngü indeksine bağlı değildir
    a[i] = invariant+10*i;
}

// döngünün daha verimli hali
invariant = 100*b[0]+15; // şimdi döngü dışına alındı
for (i=0; i<1000; i++)
{
    a[i] = invariant+10*i; // döngü artık daha az işlem yapıyor
}
  • Döngü Birleştime : Bazen 2 ve ya daha fazla döngü birleştirilerek tek bir döngü haline getirilebilir ve böylece yapılan kontrol ve atırma işlemlerinin sayısı azaltıralabilir.

örnek:

// 2 loops here
for (i=0; i<1000; i++)
{
    a[i] = i;
}
for (i=0; i<1000; i++)
{
    b[i] = i+5;
}


// one fused loop here
for (i=0; i<1000; i++)
{
    a[i] = i;
    b[i] = i+5;
}
  • Kontrolu Dışarı Alma : Bazen bir döngü, herhangi bir zamanda yalnızca birinin çalıştırılması sağlanarak iki veya daha fazla döngüye ayrılabilir.

örnek:

// döngünün her turunda kontrol tekrar tekrar çalıştırılır
for (i=0; i<1000; i++)
{
    if (X>Y)  // her turda tekrar tekrar çalıştırılır
        a[i] = i;
    else
        b[i] = i+10;
}

// Kontrol dışarıya alınır ve sadece bir kere çalışır hale gelir
if (X>Y)  // sadece bir kere çalışacak
{
    for (i=0; i<1000; i++)
    {
        a[i] = i;
    }
}
else
{
    for (i=0; i<1000; i++)
    {
        b[i] = i+10;
    }
}
  • Array Doğrusallaştırma : Döngüye sokulan çok boyutlu bir diziyi sanki (daha basiti olan) tek boyutlu bir dizi gibi işlemektir. Genelde çok boyutlu diziler (örneğin 2D diziler için NxM) hafızada kaydedilirken bir doğrusallaştırma şeması kullanırlar. Aynı şema mantığı dizideki veriye ulaşırken sanki tek boyutlu bir diziymiş gibi kullanılabilir. Bu da iç içe döngüler kullanmak yerine tek döngü kullanmayı sağlar 31, 32, 61 .

örnek:

// iç içe döngü
// N = M = 20
// toplam boyut = NxM = 400
for (i=0; i<20; i+=1)
{
    for (j=0; j<20; j+=1)
    {
        // aslında a[i, j] gösterimi a[i + j*N] gösterimine benziyor
        // çoğunlukla tek boyutlu olan daha hızlıdır
        a[i, j] = 0;
    }
}

// dizi doğrusallaştırıldığında döngü teke düşer
for (i=0; i<400; i++)
    a[i] = 0;  // önceki döngüye eşit ama tek döngü
    
    
  • Döngü Azaltma : Döngü azaltma iki (ya da daha fazla) döngü turunu teke düşürerek yapılan işlem sayısını azaltmaktır. Bu aslında kısmı döngü azaltmaktır, bütün halinde azaltma ise döngüyü tamamen ortadan kaldırıp bütün işlemi açıkta yapmaktır (işlem sayısının sabit olduğu küçük döngüler). Döngü azaltma, döngünün (ve sonuç olarak her döngü yinelemeyle ilişkili tüm ek yüklerin) daha az çalışmasına neden olur. İşlem hattına veya paralel hesaplamaya izin veren işlemcilerde, döngü açma işleminin ek bir faydası olabilir, önceki yineleme bitmeden beklemeden, hesaplanırken veya yüklenirken bir sonraki kontrolsüz yineleme başlayabilir. Dolayısıyle döngü hızı beklendiğinden daha çok artabilir 33 .

örnek:

// olağan bir döngü
for (i=0; i<1000; i++)
{
    a[i] = b[i]*c[i];
}    
    
// kısmen azaltılmış döngü
for (i=0; i<1000; i+=2)
{
    a[i] = b[i]*c[i];
    // bir sonraki tur bu turda hesaplanarak döngü artışı ikiye katlanır
    a[i+1] = b[i+1]*c[i+1];
}

// bu durum ele alınırken hassas davranmak gerekir
// örneğin azaltılmaya çalışılan döngü sayısı azaltılacak döngü sayısının tam katı olmayabilir
// bu durumda fazla olan miktar ayrıca hesaplanabilir

Veritabanları

Genel Konular

Veritabanı erişimi pahalı olabilir, bu da gerekli veri sayısını mümkün olduğunca az sayıda DB bağlantısı ve çağrı kullanarak almak daha iyi olur.

Yöntemler

  • Tembel Yüklemesi : Gerekli olmadıkça, DB erişiminden kaçınmak, uygulama ömrü boyunca fazladan veriye ihtiyaç duyulmadığı veya istenmediği durumlarda sıklık olması koşuluyla verimli olabilir

  • Önbellek : Kritik değilse ve hafif gecikmeli bir güncellemeye izin veriliyorsa, önceki sorgulanmış veri sonuçlarını aynı sorgu için yeniden kullanmak

  • Verimli Sorgu Kullanma : İlişkisel DB'ler için en etkili sorgu, verilerin DB'de benzersiz bir şekilde endekslendiği bir dizin (veya bir dizi dizin) kullanmaktır 66, 67 .

  • Yükü Dağıtma : Yükü tek bir yerine taşımak için daha fazla yardım eli (DB) ekleyin. Aslında bu, toplam yükü bölmek ve bağımsız olarak ele almak için birden fazla yere verilerin kopyalanması (artıklık oluşturma) anlamına gelir

Web

  • Daha Küçük Veri Akışı : İnternet üzerinden veri (ve genellikle bir ağ üzerinden veri) iletilmesi biraz zaman alır. Özellikle veri daha büyükse, bu nedenle sadece gerekli verileri ve hatta bunları kompakt bir biçimde iletmek en iyisidir. Bu, JSON yapısının, web’de rastgele verilerin kodlanması için XML yapısının yerini almasının bir nedenidir.

  • En Küçük Sayıda İstek Yapma : Bu prensip, önceki prensibin bir benzeri olarak görülebilir. Bu, her isteğin sadece gerekli verileri kompakt bir biçimde iletmesi gerektiği değil aynı zamanda istek sayısının en aza indirilmesi gerektiği anlamına gelir. Bu .css dosyalarını tek bir .css dosyasına (resim dosyalarını da gömülü hale getirmek), .js dosyalarını da tek bir .js dosyasına çevirme gibi işlemleri içerebilir. Bu bazen büyük boyutta dosyalar oluşturabilir ama buna rağmen bir sonraki prensip ile birlikte daha hızı bir hizmet sağlanabilir.

  • Öbellek, önbellek ve daha fazla önbellek : Bu bütün sayfaları, .css dosyalarını, .js dosyaları, resimleri vs her şeyi önbelleğe almak anlamına gelir. Sunucuda çnbellek oluşturma, itemcide önbellek oluşturma, ikisinin arasında önbellek oluşturma, kısaca heryerde önbellek kullanmak..

  • Yükü Dağıtma : Web uygulamaları için, bu genellikle birden fazla konumdan (bulut üzerinden) yüklenebilecek (statik) dosyaları depolamak amacıyla bazı bulut mimarilerinden yararlanılarak uygulanır. Diğer yaklaşımlar arasında yük dengeleme (yalnızca statik dosyalar için değil, sunucular için de yük dağıtma) bulunur.

  • Uygulama kodunu daha hızlı/sade yapın : Bu, genel olarak kod optimizasyonu ile ilgili önceki ilkelerden alınmıştır. Verimli uygulama kodu hem sunucu hem de kullanıcı kaynaklarını koruyabilir. Facebook'un HipHop VM yaratmasında bir sebep vardır..

  • Minimalizm bir sanattır : Web sayfalarını birçok html, resim dosyalarından (birçok reklam alanı olmasını saymıyorum) oluşturmak en iyi tasarım değildir ve tabiki sayfa yüklenmesini daha yavaşlatır. Dolayısıyla minimal sayfalara sahip olmak ve işlemleri AJAX ve JSON kullanarak (web 2.0 tam da bu demek) yapmak her defasında büyük sayfaları yeniden yüklemekten daha iyidir. Bu kalıp motorlarının and MVC Çatılarının yaratılmalarının bir sebebidir. Minimalizm için sanatsal boyutu kurban etmeye gerek yok çünkü Minimalizm de bir sanattır.

το λακωνίζειν εστί φιλοσοφείν (konuşma ve eylemlerde kısa, basit ve konu odaklı olmak, felsefe sanatıdır.)

Zen Circle

Kaynaklar

  1. Code optimization, wikipedia
  2. Computational complexity theory, wikipedia
  3. DRY principle, wikipedia
  4. KISS principle, wikipedia
  5. Divide and conquer algorithm, wikipedia
  6. Parallel computation, wikipedia
  7. Lazy load, wikipedia
  8. An empirical study of Fortran programs
  9. Compiler optimizations, wikipedia
  10. Register allocation, wikipedia
  11. Compiler Design Theory
  12. The art of compiler design - Theory and Practice
  13. Horner rule, wikipedia
  14. Karatsuba algorithm, wikipedia
  15. Fast multiplication of complex numbers
  16. Exponentiation by squaring, wikipedia
  17. Fast Exponentiation
  18. Strassen algorithm, wikipedia
  19. Coppersmith-Winograd algorithm, wikipedia
  20. Comments on Factorial Programs
  21. Fast Factorial Functions
  22. Isomorphism, wikipedia
  23. Representation, wikipedia
  24. Symmetry, wikipedia
  25. Merge sort, wikipedia
  26. Radix sort, wikipedia
  27. Function inlining, wikipedia
  28. Strength reduction, wikipedia
  29. Loop invariant, wikipedia
  30. Loop-invariant code motion, wikipedia
  31. Array linearisation, wikipedia
  32. Vectorization, wikipedia
  33. Loop unrolling, wikipedia
  34. Software development philosophies, wikipedia
  35. 97 Things every programmer should know
  36. Data structure, wikipedia
  37. List of data structures, wikipedia
  38. Cloud computing, wikipedia
  39. Load balancing, wikipedia
  40. Model-view-controller, wikipedia
  41. Template engine, wikipedia
  42. Three optimization tips for C
  43. Three optimization tips for C, slides
  44. What Every Programmer Should Know About Floating-Point Arithmetic
  45. What Every Computer Scientist Should Know About Floating-Point Arithmetic
  46. Optimisation techniques
  47. Notes on C Optimisation
  48. Optimising C++
  49. Programming Optimization
  50. CODE OPTIMIZATION - USER TECHNIQUES
  51. Locality of reference, wikipedia
  52. Memory access pattern, wikipedia
  53. Memory hierarchy, wikipedia
  54. Heterogeneous computing, wikipedia
  55. Stream processing, wikipedia
  56. Dataflow programming, wikipedia
  57. Fast Fourier transform, wikipedia
  58. Gaussian elimination, wikipedia
  59. Fermat's little theorem, wikipedia
  60. Trigonometric identities, wikipedia
  61. The NumPy array: a structure for efficient numerical computation
  62. Dancing links algorithm
  63. Data Interface + Algorithms = Efficient Programs
  64. Systems Should Automatically Specialize Code and Data
  65. New Paradigms in Data Structure Design: Word-Level Parallelism and Self-Adjustment
  66. 10 tips for optimising Mysql queries
  67. Mysql Optimisation
  68. A Practical Wait-Free Simulation for Lock-Free Data Structures
  69. A Highly-Efficient Wait-Free Universal Construction
  70. A Methodology for Creating Fast Wait-Free Data Structures
  71. Euclidean Algorithm
  72. Gröbner basis
  73. Newton's Method
  74. Fast Inverse Square Root
  75. Methods of computing square roots
  76. Fast Fibonacci numbers
  77. Fast k-Nearest Neighbors (k-NN) algorithm
  78. A Binary Recursive Gcd Algorithm