2012-05-09 23 views
11

C'de çok iş parçacıklı bir münferit ekleme programına sahibim ve bunu 0, 1, 2 veya 4 iş parçacığı ile test eden bir test programı. Ayrıca birden fazla test yapmak ve sonuçları toplamak için Python'da bir program yazdım.C programı, Python alt işlemcisi olarak daha hızlıdır

Garip olan şey, Python'u çalıştırdığımda, testlerin her zaman onları doğrudan kabukta çalıştırdığım zamana göre yaklaşık yarım saatte çalıştığıdır.

$ ./mergetest 4000000 4194819 140810581084 
0 threads: 1.483485s wall; 1.476092s user; 0.004001s sys 
1 threads: 1.489206s wall; 1.488093s user; 0.000000s sys 
2 threads: 0.854119s wall; 1.608100s user; 0.008000s sys 
4 threads: 0.673286s wall; 2.224139s user; 0.024002s sys 

piton komut dosyası kullanma:: Ben sıralamak için 4 milyon tamsayılar ile kendisi tarafından test programı çalıştırdığınızda

Örneğin, (son iki argüman üretme tamsayılar için tohum ve modül vardır)

$ ./mergedata.py 1 4000000 
Average runtime for 1 runs with 4000000 items each: 
0 threads: 0.677512s wall; 0.664041s user; 0.016001s sys 
1 threads: 0.709118s wall; 0.704044s user; 0.004001s sys 
2 threads: 0.414058s wall; 0.752047s user; 0.028001s sys 
4 threads: 0.373708s wall; 1.24008s user; 0.024002s sys 

Bu, kaç tane sıralama yaptığımı veya kaç kez çalıştırdığımı gösterir. Python programı, test cihazını alt işlem modülü ile çağırır, daha sonra çıkışı ayrıştırır ve toplar. Bunun neden olabileceği hakkında bir fikrin var mı? Python bir şekilde idamı iyileştiriyor mu? ya da farkında olmadığım bir şeyi doğrudan çalıştırdığımda yavaşlayan bir şey var mı?

Kod: bir kabuk komut dosyası bu sarma https://gist.github.com/2650009

+10

Bize Python kodunu gösterebilir misiniz? – NPE

+3

... ve C kodu da. Ya da en azından github veya benzeri kodlara bir işaretçi sağlayın. –

+7

Kabuktan yürütme, programın orantısız bir miktarda yazdırma süresini konsolda yapmasına neden olduğu için mi? Stdout’u '/ dev/null’e yönlendirmeyi deneyin ve durumun değişip değişmediğini görün. –

cevap

2

Sonuçta sys.maxint'i alt işlemlere rasgele sayılar oluşturmak için modül olarak geçiyordum. C, 64-bit tamsayıyı kesiyordu ve imzalı olarak yorumluyordu, yani, ikilinin tamamlayıcısında -1, böylece her rastgele sayı bu şekilde değiştiriliyordu ve 0 oluyordu. Yani, tüm aynı değerleri sıralamak, yaklaşık olarak yarım gibi görünmektedir. rastgele veri olarak çok fazla zaman.

0

muhtemelen aynı etkiye sahip olacaktır. eğer öyleyse, konsol işlemleri

+0

Bir bash komut dosyasında sarılmanın hiçbir etkisi yoktu - python'da olduğu gibi iki kat daha yavaş. Hangi konsol operasyonları performansı çok etkiler? – scry

+0

Çıkışın arabelleğe alınması. Bence python senaryosunu, bunu çözme şansına sahip olmak için göndermelisin. –

İlgili konular