2011-11-17 18 views
5

मैंने एक दिलचस्प प्रदर्शन conundrum में भाग लिया है, लेकिन इससे पहले कि मैं glibc में delving शुरू करने और सही और केंद्र छोड़ दिया बग दर्ज करने से पहले मैं बस बाहर हो सकता है कि कोई अंतर्दृष्टि प्राप्त करना चाहता था।strftime प्रदर्शन बनाम snprintf

gettimeofday(&tv, 0); 
localtime_r(&tv.tv_sec, &local_tm); 
char result[25]; 
strftime(result, 24, "%Y-%m-%d %H:%M:%S", &local_tm); 

कोड के बाकी इस प्रश्न के लिए अप्रासंगिक है:

मैं कोड कार्यों में से एक में यह करता है कि की है। जब मैं इसे इसके साथ बदलता हूं:

gettimeofday(&tv, 0); 
localtime_r(&tv.tv_sec, &local_tm); 
char result[25]; 
snprintf(result, sizeof(result), "%04d-%02d-%02d %02d:%02d:%02d", 
     local_tm.tm_year+1900, local_tm.tm_mon+1, 
     local_tm.tm_mday, local_tm.tm_hour, local_tm.tm_min, 
     local_tm.tm_sec); 

औसतन मुझे 20% प्रदर्शन बढ़ावा मिलता है।

क्या कोई इसमें भाग गया है? क्या यह ओएस विशिष्ट है?

+0

आप किस ओएस/कंपाइलर का उपयोग कर रहे हैं? –

+3

तो 'snprintf' आपके सिस्टम पर' strftime 'से अधिक कुशल है। इसे "बग" नहीं माना जाएगा। –

+6

'strftime' को स्थानीयकरण से निपटना पड़ सकता है (' snprintf' से अधिक)। –

उत्तर

6

POSIX strftime की आवश्यकता है (जैसे कि यह किया है या अधिनियम) tzset() कॉल करने के लिए, एक Linux सिस्टम पर होने की संभावना स्टेट/etc/समय क्षेत्र और अन्य फ़ाइलों को, जो धीमी है (snprintf की तुलना में) करेंगे। TZ पर्यावरण परिवर्तक को सेट करना आम तौर पर इसे एक बड़ा बढ़ावा देगा।

टिप्पणियों में कहा गया था कि यह संदेश को भी स्थानीयकृत करता है।

+0

'TZ' पर्यावरण चर को ज़ोन नाम/पथ पर सेट करने से शायद मदद नहीं मिलेगी, लेकिन 'EST5EDT, M3.2.0/2, M11.1.0/2' जैसे POSIX-style Zone विवरण का उपयोग करके निश्चित रूप से इसे गति मिलेगी (ऐतिहासिक डीएसटी नियम मतभेदों के समर्थन की कीमत पर)। –

+0

धन्यवाद। मुझे वास्तव में पता चला कि जीएलबीबीसी 2.11 में उस समस्या का हल हो गया है। बिल्कुल यह सुनिश्चित नहीं है कि यह सबसे पुराना संस्करण क्या हुआ था। – Karlson

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