Eğlence için derlenmiş bir dil yazıyorum ve son zamanlarda derleyicimi çok güçlü yapmak için bir tekme atışı yaptım. Bazı şeyleri optimize etmenin çeşitli yollarını buldum, örneğin, 2 + 2 her zaman 4, yani bu matematiği derleme zamanında yapabiliriz, eğer (yanlış) {...} tamamen kaldırılabilirse, vs. Döngüleri aldım. Bazı araştırmalardan sonra, yapmaya çalıştığım şeyin tam olarak döngüsel değil, ama yine de bir optimizasyon tekniği olduğunu düşünüyorum. Açıklamama izin ver."Statik" döngülerinin optimizasyonu
Aşağıdaki kodu kullanın.
String s = "";
for(int i = 0; i < 5; i++){
s += "x";
}
output(s);
bir insan gibi, ben burada oturup bu zamanın% 100 Yani
output("xxxxx");
eşdeğer olacak olduğunu söyleyebilirim, başka bir deyişle, bu döngü "derlenebilir "tamamen". Döngüsel bir döngü değil, "tam statik" dediğim şey, yani, segmentin davranışını değiştirecek hiçbir girdi yok. Benim fikrim, tamamen statik olan herhangi bir şeyin tek bir değere çözülebilmesi, girdiye dayanan veya koşullu çıkışı sağlayan herhangi bir şey daha fazla optimize edilememesidir. Dolayısıyla, makinenin bakış açısından, neye dikkat etmem gerekiyor? Bir döngüyü "tam statik" yapan nedir?
Nasıl kategorize edileceğini anlatabilmem için üç tür döngüden söz ediyorum. Her çalışmadan sonra, her girişten sonra, girişler ne olursa olsun, ASLA OLMAYACAĞIZ döngüler ve bir şekilde ya da diğerini anlayamadığım döngülerle sonuçlanacak döngüler. Bunu çözemediğim durumda (koşullu olarak dinamik girişlere göre kaç kez çalışacağını değiştirir), optimizasyon konusunda endişelenmiyorum. Sonsuz olan döngüler, programlayıcı tarafından özel olarak bastırılmadıkça bir derleme hatası/uyarısı olacaktır ve her defasında aynı olan döngüler, doğrudan doğruya makineyi uygun duruma getirerek döngü yapmadan atlamalıdır.
En iyi duruma getirilmesi gereken ana durum, içerdeki tüm işlevler de statik olduğunda statik döngü yinelemeleridir. Döngünün dinamik bileşenlere sahip olup olmadığını belirleme yeteri kadar kolaydır ve dinamik değilse statik olması gerekir. Anlayamadığım şey, sonsuzluk olup olmayacağını tespit etmektir. Bunun hakkında herhangi bir fikri var mı? Bunun durma probleminin bir alt kümesi olduğunu biliyorum, ama çözülebilir olduğunu düşünüyorum; Durma problemi, bazı program alt kümeleri için, sonsuza kadar koşabileceğini söyleyememeniz nedeniyle bir problemdir, olmayabilir, ancak bu vakaları düşünmek istemiyorum, sadece vakaları düşünmek istiyorum nerede duracak, ya da durmayacak, ama önce üç devlet arasında ayrım yapmak zorundayım.
Şu anda bu satırda neyin desteklendiğine dair bir fikir edinmek için, yeni C++ standardında "constexpr" üzerindeki sınırlamaları okumak isteyebilirsiniz. –
Döngü koşulunun her zaman doğru olduğunu ve döngüden çıkmanın başka bir yolu olmadığını statik olarak belirleyebilirseniz, döngü sonlanmayacağını bilirsiniz. –
Örneğinizde, String'in aynı zamanda extern ile başvuran ve onu paralel bir dizgede değiştiren başka bir dosya tarafından da değiştirilmediğini bilmeniz gerekmez. – TJD