2012-04-11 18 views
11

में बाइटस्ट्रिंग को कुशलतापूर्वक चालू करें, मुझे SHA512 हैश के हेक्स प्रस्तुति देने में सक्षम होना आवश्यक था। शायद मैं काफी कठिन नहीं लग रहा था, लेकिन मुझे ऐसा करने के लिए हैकेज पर कोई भी फ़ंक्शन मिल सकता था। इसलिए मैंने unfoldrN का उपयोग करके एक कार्यान्वयन लिखा। यह मेरे उद्देश्यों के लिए निश्चित रूप से पर्याप्त तेज़ है, लेकिन मुझे आश्चर्य है कि अगर कोई तेज दृष्टिकोण के बारे में जानता है।कुशलतापूर्वक एक हेक्स प्रतिनिधित्व

मैंने गिटूब पर एक क्रिया के रूप में अपना कार्यान्वयन किया है: https://gist.github.com/2356925। फ़ाइल में Numeric.showHex, एक क्विक चेक परीक्षण और एक मानदंड बेंचमार्क के आधार पर एक सरल कार्यान्वयन भी शामिल है। बनाम unfoldrN संस्करण सरल संस्करण के मेरे वर्तमान परिणाम हैं:

benchmarking simple 
mean: 4.677296 ms, lb 4.656011 ms, ub 4.696684 ms, ci 0.950 
std dev: 104.2791 us, lb 87.77023 us, ub 128.1627 us, ci 0.950 
found 5 outliers among 100 samples (5.0%) 
    4 (4.0%) low mild 
variance introduced by outliers: 15.195% 
variance is moderately inflated by outliers 

benchmarking unfoldrN_MS1 
mean: 370.0101 us, lb 365.9819 us, ub 373.8619 us, ci 0.950 
std dev: 20.17016 us, lb 16.92772 us, ub 24.08982 us, ci 0.950 
found 14 outliers among 100 samples (14.0%) 
    7 (7.0%) low mild 
    7 (7.0%) high mild 
variance introduced by outliers: 52.467% 
variance is severely inflated by outliers 

इसे कोई भी सुधार लाने के लिए एक चाकू ले जाना चाहते हैं?

+3

http://whosawthatcoming.com/private/PMBFOGQIHT ब्लैम! – Will

उत्तर

8

जा रहे हैं निचले स्तर,

import Data.ByteString.Internal 
import Foreign.Ptr 
import Foreign.Storable 
import qualified Data.ByteString as B 
import Data.ByteString.Unsafe 
import Data.Bits 
import Data.Word 

maxLen :: Int 
maxLen = maxBound `quot` 2 

hexDig :: Word8 -> Word8 
hexDig d 
    | d < 10 = d + 48 
    | otherwise = d + 87 

toHex :: ByteString -> ByteString 
toHex bs 
    | len > maxLen = error "too long to convert" 
    | otherwise = unsafeCreate nl (go 0) 
     where 
     len = B.length bs 
     nl = 2*len 
     go i p 
      | i == len = return() 
      | otherwise = case unsafeIndex bs i of 
          w -> do poke p (hexDig $ w `shiftR` 4) 
            poke (p `plusPtr` 1) (hexDig $ w .&. 0xF) 
            go (i+1) (p `plusPtr` 2) 

मैं 3.5 के बारे में एक और पहलू के आधार पर अपने बॉक्स पर रूपांतरण के समय को कम कर सकता है। थोड़ा अधिक समय sample (25000) बनाना, मैं

benchmarking simple 
mean: 13.76532 ms, lb 13.64184 ms, ub 13.88680 ms, ci 0.950 
std dev: 633.2413 us, lb 582.6342 us, ub 687.9701 us, ci 0.950 
variance introduced by outliers: 44.438% 
variance is moderately inflated by outliers 

benchmarking unfoldrN_MS1 
mean: 430.5705 us, lb 424.9206 us, ub 438.5689 us, ci 0.950 
std dev: 33.85429 us, lb 26.25623 us, ub 45.74915 us, ci 0.950 
found 4 outliers among 100 samples (4.0%) 
    3 (3.0%) high mild 
    1 (1.0%) high severe 
variance introduced by outliers: 69.726% 
variance is severely inflated by outliers 

benchmarking LowHex 
mean: 123.6000 us, lb 123.0551 us, ub 124.7084 us, ci 0.950 
std dev: 3.837497 us, lb 1.869370 us, ub 6.470112 us, ci 0.950 
found 6 outliers among 100 samples (6.0%) 
    4 (4.0%) high mild 
    2 (2.0%) high severe 
variance introduced by outliers: 25.818% 
variance is moderately inflated by outliers 

मिला मूल 500 लंबे sample के लिए, यह था

benchmarking simple 
mean: 2.603306 ms, lb 2.583054 ms, ub 2.629212 ms, ci 0.950 
std dev: 116.5341 us, lb 81.61409 us, ub 191.3293 us, ci 0.950 
found 7 outliers among 100 samples (7.0%) 
    2 (2.0%) low severe 
    3 (3.0%) low mild 
    1 (1.0%) high severe 
variance introduced by outliers: 42.490% 
variance is moderately inflated by outliers 

benchmarking unfoldrN_MS1 
mean: 83.19349 us, lb 82.88474 us, ub 83.58283 us, ci 0.950 
std dev: 1.771460 us, lb 1.486104 us, ub 2.174729 us, ci 0.950 
found 14 outliers among 100 samples (14.0%) 
    12 (12.0%) high mild 
    2 (2.0%) high severe 
variance introduced by outliers: 14.225% 
variance is moderately inflated by outliers 

benchmarking LowHex 
mean: 24.50564 us, lb 24.41683 us, ub 24.61241 us, ci 0.950 
std dev: 497.1908 ns, lb 415.6366 ns, ub 609.7594 ns, ci 0.950 
found 5 outliers among 100 samples (5.0%) 
    5 (5.0%) high mild 
variance introduced by outliers: 13.256% 
variance is moderately inflated by outliers 
+0

अच्छा गति। ऐसा लगता है कि कुछ भी तेजी से आ रहा है, इसलिए मुझे लगता है कि यह जीतता है। क्या आप वहां किसी भी पैकेज के बारे में सोच सकते हैं जहां इस समारोह को जोड़ने का अर्थ होगा? –

2

ऐसा लगता है कि मैं सिर्फ

hex :: B.ByteString -> String 
hex = concatMap (printf "%02x") . B.unpack 

पिछली बार इस्तेमाल किया मैं ऐसा करना चाहता था। यह Crypto.Hash लाइब्रेरी iirc के संयोजन के साथ था। मुझे संदेह है कि प्रदर्शन बहुत अच्छा है, लेकिन (धीमी) sha512 फ़ंक्शन की तुलना में, हेक्स रूपांतरण क्यों एक मुद्दा होगा?

6

जो फ़ंक्शन आप खोज रहे हैं वह Data.ByteString.Builder.byteStringHex (या आलसी बाइटस्ट्रिंग्स के लिए इसका जुड़वां फ़ंक्शन) है, जो नए बाइटस्ट्रिंग बिल्डर द्वारा प्रदान किया जाता है। मैं extended your benchmarks और मेरे मशीन पर निम्न परिणाम प्राप्त:

benchmarking size 5000/simple 
mean: 2.469847 ms, lb 2.440422 ms, ub 2.522850 ms, ci 0.950 
std dev: 196.5903 us, lb 116.8811 us, ub 318.4720 us, ci 0.950 
found 16 outliers among 100 samples (16.0%) 
    3 (3.0%) low severe 
    2 (2.0%) low mild 
    10 (10.0%) high severe 
variance introduced by outliers: 70.721% 
variance is severely inflated by outliers 

benchmarking size 5000/unfoldrN_MS1 
mean: 102.6075 us, lb 101.7695 us, ub 104.0159 us, ci 0.950 
std dev: 5.468574 us, lb 3.681120 us, ub 8.080665 us, ci 0.950 
found 16 outliers among 100 samples (16.0%) 
    6 (6.0%) high mild 
    10 (10.0%) high severe 
variance introduced by outliers: 51.455% 
variance is severely inflated by outliers 

benchmarking size 5000/byteStringHexFixed 
mean: 5.675204 us, lb 5.636296 us, ub 5.750211 us, ci 0.950 
std dev: 264.3726 ns, lb 140.9738 ns, ub 398.8494 ns, ci 0.950 
found 5 outliers among 100 samples (5.0%) 
    4 (4.0%) high severe 
variance introduced by outliers: 44.476% 
variance is moderately inflated by outliers 

मैं इस नंबर की तरह। बहुत बुरा है कि बाइटिंग लाइब्रेरी में मेरे पैच अभी भी डंकन कॉउट्स द्वारा समीक्षा अधीन हैं। नवीनतम में नवीनतम बाइटस्ट्रिंग निर्माता अगले जीएचसी रिलीज के साथ उपलब्ध होगा।

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