2014-12-08 10 views
6

मैं सोच रहा था कि a!=0!a==0 से अधिक है और आर पैकेज माइक्रोबेंमार्क का उपयोग किया गया है। कोड यह (3e6 और 100 को कम करता है, तो अपने पीसी धीमी है):गणना समय! =

library("microbenchmark") 
a <- sample(0:1, size=3e6, replace=TRUE) 
speed <- microbenchmark(a != 0, ! a == 0, times=100) 
boxplot(speed, notch=TRUE, unit="ms", log=F) 

हर, मैं नीचे से एक की तरह एक साजिश मिलता है। जैसा कि अपेक्षित है, पहला संस्करण दूसरे (33 एमएस) की तुलना में तेज (औसत 26 मिलीसेकंड) है।

लेकिन इन कुछ बहुत ही उच्च मूल्य (आउटलाइर्स) कहां से आते हैं? क्या यह कुछ स्मृति प्रबंधन प्रभाव है? अगर मैं 10 से समय निर्धारित करता हूं, तो कोई आउटलेटर्स नहीं हैं ...

संपादित करें: sessionInfo(): आर संस्करण 3.1.2 (2014-10-31) प्लेटफ़ॉर्म: x86_64-w64-mingw32/x64 (64-बिट)

computation time unequal and not_equal

+2

मुझे नहीं लगता कि यह पता लगाने के लिए आसान होने जा रहा है है, मैंने 'times = 10' या तो भी इसी तरह के परिणाम देखे हैं। ध्यान रखें कि 'माइक्रोबेंमार्क' बुलेटप्रूफ नहीं है। वहाँ कुछ ब्लॉग हैं जो कहीं सेमिबग इंगित करते हैं कि यह समय की जानकारी कैसे एकत्र करता है। यह भी हो सकता है कि कुछ अन्य "चीज" हर समय होती है और फिर 'आर' संचालन के सामान्य पाठ्यक्रम के दौरान - एक 'जीसी' कॉल, या सिस्टम स्तर पर रैम पुनर्वितरण की प्रतीक्षा आदि। शायद एक लूप चलाने की कोशिश करें 'system.time' देखने के लिए परिणाम का वितरण क्या है? –

उत्तर

2

आप कहते हैं कि आप बाहरी कारकों के कारण जब times=10 नहीं है, लेकिन times=10 कई बार साथ microbenchmark चलाने के लिए और आप अजीब बाहरी देखे जाने की संभावना है। times=100 के एक रन की तुलना यहां times=10 के दस रनों के साथ की गई है, जो दर्शाती है कि बाह्य परिस्थितियों में दोनों स्थितियां होती हैं।

अभिव्यक्ति में शामिल वस्तुओं के आकार के आधार पर, मुझे लगता है कि आपकी मशीन मेमोरी सीमाओं के साथ संघर्ष कर रही है, लेकिन वे सीपीयू तनाव के कारण भी हो सकते हैं। गैर-आर प्रक्रियाओं के कारण।

a <- sample(0:1, size=3e6, replace=TRUE) 
speed1 <- microbenchmark(a != 0, ! a == 0, times=100) 
speed1 <- as.data.frame(speed1) 

speed2 <- replicate(10, microbenchmark(a != 0, ! a == 0, times=10), simplify=FALSE) 
speed2 <- do.call(rbind, lapply(speed2, cbind)) 

times <- cbind(rbind(speed1, speed2), method=rep(1:2, each=200)) 
boxplot(time ~ expr + method, data=times, 
     names=c('!=; 1x100', '!==; 1x100', '!=; 10x10', '!==; 10x10')) 

enter image description here

+0

संकल्प के इस स्तर पर, मुझे लगता है कि आउटलाइजर्स लगभग हमेशा कचरा संग्रह – hadley

0

मुझे लगता है कि तुलना slighlty अनुचित है। बेशक आप आउटलाइर्स प्राप्त करेंगे, गणना समय कई कारकों (कचरा संग्रह, कैश किए गए परिणाम, आदि) पर निर्भर है, इसलिए यह वास्तव में एक आश्चर्य नहीं है। आप सभी बेंचमार्क में एक ही वेक्टर a का उपयोग कर रहे हैं ताकि कैशिंग निश्चित रूप से एक भूमिका निभाए।

मैं a चर गणना करने से पहले randomizing द्वारा एक सा प्रक्रिया समायोजित, और मैं अपेक्षाकृत तुलनीय परिणाम मिल गया:

library("microbenchmark") 
do.not<-function() { 
    a <- sample(0:1, size=3e6, replace=TRUE) 
    a!=0; 
} 

do<-function() { 
    a <- sample(0:1, size=3e6, replace=TRUE) 
    a==0; 
} 

randomize <- function() { 
    a <- sample(0:1, size=3e6, replace=TRUE) 
} 


speed <- microbenchmark(randomize(), do.not(), do(), times=100) 
boxplot(speed, notch=TRUE, unit="ms", log=F) 

Boxplot

मैं भी एक मानक के रूप में sample समारोह जोड़ा गया है और देखना यह कैसे 'अस्थिर' है।

व्यक्तिगत रूप से मैं आउटलाइन पर आश्चर्यचकित नहीं हूं। इसके अलावा, भले ही आप size=10 के लिए एक ही बेंचमार्क चलाते हैं, फिर भी आप आउटलाइन प्राप्त करते हैं। वे गणना का परिणाम नहीं हैं, लेकिन संपूर्ण पीसी हालत (चल अन्य लिपियों, स्मृति लोड, आदि) के

धन्यवाद

+2

का परिणाम होते हैं, आप '! =' और '==' की तुलना करते हैं।अलग-अलग समय '!' में एक अतिरिक्त कॉल का परिणाम है! (ए == 0) '। – Roland

संबंधित मुद्दे