2011-02-03 19 views
11

Çalıştığım bir programı test ediyorum ve bunu -g ile derlediğimde 3μs daha hızlı (istatistiksel olarak önemli bir değişiklik) olduğunu görüyorum. Bu benim için hiçbir anlam ifade etmiyor - Ben -g bayrağı programın çalışmasını etkilememesi gerektiğini düşündüm, ve bunu yapsa bile daha hızlı, daha yavaş çalışmasını sağlardı.gcc -g hata ayıklama bayrağı program yürütülmesini etkiler mi?

Bana bunun neden olduğunu söyleyen var mı? Ve programlar yürütme akışını değiştirip değiştirmediği? -O ile derleme yapmıyorum çünkü tam olarak yazılı olarak çalışmam gerekiyor, ama -g bir şekilde talimatı değiştirerek daha hızlı çalışabilirse, bunu açıkça kullanmalıyım.

Bu nedenle, -g işaretinin programa ne tür değişiklikler yaptığını tam olarak bilmem gerekiyor.

Düzenleme: Çalıştığım daha fazla sınama, t-değeri ne kadar büyük olur (= fark istatistiksel olarak anlamlı olur). Bu kesinlikle ölçüm hatası değil - bir şeyler oluyor.

+0

Ayrıca: -g her zaman programların daha hızlı çalışmasını sağlarsa, varsayılan olarak açık olur, bu yüzden programımı özel yapan ne olabilir? – Benubird

+5

3us gerçekten istatistiksel olarak anlamlı bir değişiklik midir? Bu, sistem saatinin doğru olduğu hıza yaklaşıyor ve bu, eğer rastgele gürültüden başka bir şey olursa şaşıracaktım. – templatetypedef

+0

Oldu. Her versiyonun 1000'den fazla testi, t istatistiği 40 d.f ile 1,8'dir. Bu yaklaşık% 95 önemli. – Benubird

cevap

10

Diğerlerinin söylediğine göre, hata ayıklama sembolleri, derleyicide (olası) bir hata olmadıkça kodunuzun kontrol akışını değiştirmeyecektir.

Yürütme işlemi daha büyük hale geldiğinden ve yürütülen kod daha fazla sayfada daha yaygın olarak yayıldığı için yürütmeyi değiştirir. Daha fazla önbellek atışı ve IO sinyali bekleyebilirsiniz. Çok görevli bir ortamda (ve hatta bir Linux/busybox sistemi böyle bir şeydir) bunun sonucunda biraz farklı zamanlama davranışı ortaya çıkabilir. Diğer yandan, bunları tanımladığınız kadar küçük zaman farklarını ölçmek, kendi haklarıyla bir sanattır. Muhtemelen ölçümlerinizin yürütme sürelerini etkilediği bir Heisenberg ortamındasınız. Ölçümleriniz istatistiksel olarak anlamlı bir sapma gösterebilir, ancak bu tür bir seçeneğin daha hızlı kod oluşturduğunu söyleyerek onları yorumlamada son derece dikkatli olurdum.

+0

Bu mantıklı. Ancak, önbellek özetleri yürütmeyi yavaşlatır, daha hızlı değil mi? – Benubird

+0

@Benubird: Her şeyden önce ölçümleri bozar. –

+0

@Jens Üzgünüm, hala takip etmiyorum. Önbellek özetleri, yürütme süresini nasıl azaltabilir? – Benubird

7

-g bayrağı, gerçek üretilen kodda 0 değişiklik yapar. Ne yapar, yürütülebilir dosyaya hata ayıklama bölümleri eklemektir. Bu bölümler çalışma zamanında yüklenmez, ancak hata ayıklayıcılar bunları yükleyebilir. Yürütülebilir sürümü biraz farklı olduğundan daha büyüktür - tne no'yu ölçmeye çalışabilirsiniz. sayfa hataları, bir sürüm diğerine göre devam ediyor., yürütülebilir dosyanın diskte nasıl saklandığıyla ilgili değişiklikler olacak, ancak kod değişmiyor. Eğer montaj bakınız İkili üzerinde -d objdump çalıştırmak ve karşılaştırmak isterseniz

Ben güvenilir, en azından bir genel amaçlı OS üzerinde, 3US ölçme olsa 3US artış doğruluğunu sorgulamak yapmak zor olduğu Görev - Umarım programınızı birkaç bin kez (büyük olasılıkla birkaç yüz bin kat daha fazla) bu sayıya ulaşmak için böyle bir ölçümü etkileyen tüm rastgele şeyleri ortadan kaldırmaya çalışın.

+0

Aslında bir genel amaçlı işletim sisteminde çalışmıyorum - özel bir busybox sistemde, sadece ptpd, cron, ssh ve bu çalışıyor. Zamanlama oldukça doğru, ama idam yaklaşık 1 dakika sürdüğü için yüzlerce kez maalesef kaçmak için zamanım yok. – Benubird

1

Alt yordamlardan birinde -debug ve -g işaretlerini kullandığımda, kodumla farklı bir yanıt alıyorum, bu yüzden nedenini bilmeme rağmen, evet kesinlikle program yürütmesini etkiliyor.

+0

Bu soruya bir cevap vermez. Bir yazarın eleştirisini yapmak ya da yorum istemek için yazılarının altında bir yorum bırakın. – osyan

+3

Belirli bir karma eşiğin altında iseniz yorum yapamazsınız (100 inanıyorum) – Michael

İlgili konular