Çeşitli kod optimizasyon yöntemlerinden oluşan derleme
- Genel Prensipler
- Alt-seviye
- Dile bağımlı optimizasyon
- Dile bağımlı optimizasyon
- Veritabanları
- Web
- Referanslar
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 :) ).
-
DRYPrensibi 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)^2aslında400sabitine eşittir, bir başka örnek iseinfixifade notasyonundan daha hızlı ayrıştırılabilenprefix(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
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
-
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 THENakışı incelenerek basit birJumpcümlesine çevrilebilir, vs.
- 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.
-
İ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/THENtalimatları ve mantığı, özünde cpudalıtalimatlarıdır. CPU dal talimatları, programişaretçisinindeğiştirilmesini ve yeni bir yere gitmesini içerir. Çok fazlajumptalimatı içerirmesi durumunda bu çok yavaş olabilir.Bununla birlikte,IF/THENifadelerinin 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 verimlidalı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çarpmaile veçarpma'yıtoplamaile (ö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^bhesaplaması, daha basit bir yöntemlea,b=0,1,2iç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
2Ddiziler içinNxM) hafızada kaydedilirken bir doğrusallaştırma şeması kullanırlar. Aynı şema mantığı dizideki veriye ulaşırken sankitekboyutlu 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 hesaplanabilirVeritabanı 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.
-
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
-
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,
JSONyapısının, web’de rastgele verilerin kodlanması içinXMLyapı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
.cssdosyalarını tek bir.cssdosyasına (resim dosyalarını da gömülü hale getirmek),.jsdosyalarını da tek bir.jsdosyası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ı,
.cssdosyalarını,.jsdosyaları, 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 VMyaratması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
AJAXveJSONkullanarak (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.
- Code optimization, wikipedia
- Computational complexity theory, wikipedia
- DRY principle, wikipedia
- KISS principle, wikipedia
- Divide and conquer algorithm, wikipedia
- Parallel computation, wikipedia
- Lazy load, wikipedia
- An empirical study of Fortran programs
- Compiler optimizations, wikipedia
- Register allocation, wikipedia
- Compiler Design Theory
- The art of compiler design - Theory and Practice
- Horner rule, wikipedia
- Karatsuba algorithm, wikipedia
- Fast multiplication of complex numbers
- Exponentiation by squaring, wikipedia
- Fast Exponentiation
- Strassen algorithm, wikipedia
- Coppersmith-Winograd algorithm, wikipedia
- Comments on Factorial Programs
- Fast Factorial Functions
- Isomorphism, wikipedia
- Representation, wikipedia
- Symmetry, wikipedia
- Merge sort, wikipedia
- Radix sort, wikipedia
- Function inlining, wikipedia
- Strength reduction, wikipedia
- Loop invariant, wikipedia
- Loop-invariant code motion, wikipedia
- Array linearisation, wikipedia
- Vectorization, wikipedia
- Loop unrolling, wikipedia
- Software development philosophies, wikipedia
- 97 Things every programmer should know
- Data structure, wikipedia
- List of data structures, wikipedia
- Cloud computing, wikipedia
- Load balancing, wikipedia
- Model-view-controller, wikipedia
- Template engine, wikipedia
- Three optimization tips for C
- Three optimization tips for C, slides
- What Every Programmer Should Know About Floating-Point Arithmetic
- What Every Computer Scientist Should Know About Floating-Point Arithmetic
- Optimisation techniques
- Notes on C Optimisation
- Optimising C++
- Programming Optimization
- CODE OPTIMIZATION - USER TECHNIQUES
- Locality of reference, wikipedia
- Memory access pattern, wikipedia
- Memory hierarchy, wikipedia
- Heterogeneous computing, wikipedia
- Stream processing, wikipedia
- Dataflow programming, wikipedia
- Fast Fourier transform, wikipedia
- Gaussian elimination, wikipedia
- Fermat's little theorem, wikipedia
- Trigonometric identities, wikipedia
- The NumPy array: a structure for efficient numerical computation
- Dancing links algorithm
- Data Interface + Algorithms = Efficient Programs
- Systems Should Automatically Specialize Code and Data
- New Paradigms in Data Structure Design: Word-Level Parallelism and Self-Adjustment
- 10 tips for optimising Mysql queries
- Mysql Optimisation
- A Practical Wait-Free Simulation for Lock-Free Data Structures
- A Highly-Efficient Wait-Free Universal Construction
- A Methodology for Creating Fast Wait-Free Data Structures
- Euclidean Algorithm
- Gröbner basis
- Newton's Method
- Fast Inverse Square Root
- Methods of computing square roots
- Fast Fibonacci numbers
- Fast k-Nearest Neighbors (k-NN) algorithm
- A Binary Recursive Gcd Algorithm
