dikkate alındığında aşağıdaki test programları: O0 onları hazırlayarakNeden dereferencing programımı daha hızlı hale getiriyor?
int main(void) {
int iterations = 1000000000;
while (iterations > 0)
-- iterations;
}
Loop value on the stack (dereferenced)
int main(void) {
int iterations = 1000000000;
int * p = & iterations;
while (* p > 0)
-- * p;
}
#include <stdlib.h>
int main(void) {
int * p = malloc(sizeof(int));
* p = 1000000000;
while (*p > 0)
-- * p;
}
, Ben olsun o Aşağıdaki yürütme süreleri:
case1.c
real 0m2.698s
user 0m2.690s
sys 0m0.003s
case2.c
real 0m2.574s
user 0m2.567s
sys 0m0.000s
case3.c
real 0m2.566s
user 0m2.560s
sys 0m0.000s
[değiştir] 10 yürütmeler ortalama aşağıdadır:
case1.c
2.70364
case2.c
2.57091
case3.c
2.57000
Neden en basit gibi görünüyor ilk test durumunda, birlikte yürütme zamanı büyük?
Şu anki mimarim x86 sanal makinesidir (Archlinux). Bu sonuçları hem gcc (4.8.0) hem de clang (3.3) ile elde ediyorum.
[değiştir 1] Oluşturulan derleyici kodları hemen hemen aynıdır, ancak ikinci ve üçüncü olanlar ilkinden daha fazla yönergeye sahip olmaları dışında.
[değiştir 2] Bu performanslar tekrarlanabilir (sistemimde). Her uygulama aynı büyüklük derecesine sahip olacaktır.
[edit 3] Optimize edilmemiş bir programın performanslarını umursamıyorum, ancak neden daha yavaş olacağını anlamıyorum ve merak ediyorum.
Oluşturulan koda bakmayı denediniz mi? Niçin düzenlenmemiş kodun performansını önemsiyorsunuz? –
Hae onları farklı bir düzende çalıştırmayı denediniz mi? Bu tek çekim süreleri mi, yoksa ortalama sayısı önemli sayıda mı? – EJP
@CarlNorum Neredeyse aynı üretilen kod, son iki örnekte daha fazla talimat (hareket ve yükleme) olması dışında. Performansları umursamıyorum, ama hala merak ediyorum :) –