2012-04-05 36 views
9

3 dizi bildirimi olan bir C++ kodum var. Ben NUM=512 ile derlerkeng ++ derleme zamanı dizi boyutuna bağlı mı?

float A[NUM]; float B[NUM]; float C[NUM];

, derleme ben NUM=167772160 ile derleme yaparken, daha uzun sürer,

time g++ -DNUM=512 trials trials.cpp -lm

0.16s user 0.04s system 94% cpu 0.219 total

Ancak hızlı.

time g++ -DNUM=167772160 trials trials.cpp -lm

7.90s user 0.69s system 99% cpu 8.604 total

yıllarda C++ kullanmadım. Derlemeden sonra nesne dosyalarının aynı boyutta olmasına rağmen neden derlemede bir zaman farkı olduğunu bilmek merak ediyorum.

+1

Bu diziler statik veriler midir? –

+0

Küresel bildirimlerdir. – mutelogan

+1

g ++ hangi optimizasyonların yapıldığını bilir. Belki de geçersiz bellek erişimi hakkında uyarı almak için böyle bir dizi ayırır. Karşılaştırmayı tekrar -O0 ile tekrar çalıştırmayı deneyin (belki birden çok kez yapın) ve derlemeyi ve bağlantıyı ayrı ayrı yapın. – j13r

cevap

10

Bu oldukça iyi bilinen bir bilmece. Bir şekilde diziye gerçek bellek tahsis edilecek gidiyor

Bkz: şüphesi edilebileceği gibi Linker performance related to swap space?

O ld benziyor, o görünür aslında anonim çalışıyor Bu dizinin tüm statik bellek alanını (veya muhtemelen tüm programı, programın geri kalanı çok küçük olduğundan, bu fazladan 4096'ya sığabileceğinden) söylemek zor.

İlgili diğer konular:

+0

Her şeyden sonra linker performansı !! Çok teşekkürler. – mutelogan

0

diziniz veya küresel olarak deklare mı? Dünya çapında ise, linker .data bölümünde bellek ayırması gerektiğinden, bu uzun zaman alabilir. Ancak, yerel olarak bildirirseniz, bellek çalışma zamanında ayrılmış olduğundan, bağlantı süresi değil. Linker'ın problemi olacak, fakat derleyicinin analizörü veya optimize edicisi tarafından sebep olunan bir problem.

İlgili konular