Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/d5b5d48881b3adbf3bd5e177ee6ef506e589b882

>---------------------------------------------------------------

commit d5b5d48881b3adbf3bd5e177ee6ef506e589b882
Author: Ian Lynagh <i...@well-typed.com>
Date:   Wed Dec 12 17:12:13 2012 +0000

    Use ByteString rather than FastBytes inside FastZString
    
    Slow nofib Compile Times difference looks like just noise:
    -1 s.d.        -2.9%
    +1 s.d.        +2.9%
    Average        -0.1%

>---------------------------------------------------------------

 compiler/utils/BufWrite.hs    |   31 ++++++++++++++++++++-----------
 compiler/utils/FastString.lhs |   22 ++++++++++++----------
 2 files changed, 32 insertions(+), 21 deletions(-)

diff --git a/compiler/utils/BufWrite.hs b/compiler/utils/BufWrite.hs
index ea5cee0..5ad165d 100644
--- a/compiler/utils/BufWrite.hs
+++ b/compiler/utils/BufWrite.hs
@@ -35,8 +35,11 @@ import FastTypes
 import FastMutInt
 
 import Control.Monad   ( when )
+import Data.ByteString (ByteString)
+import qualified Data.ByteString.Unsafe as BS
 import Data.Char       ( ord )
 import Foreign
+import Foreign.C.String
 import System.IO
 
 -- 
-----------------------------------------------------------------------------
@@ -88,21 +91,27 @@ bPutFS :: BufHandle -> FastString -> IO ()
 bPutFS b fs = bPutFB b $ fastStringToFastBytes fs
 
 bPutFZS :: BufHandle -> FastZString -> IO ()
-bPutFZS b fs = bPutFB b $ fastZStringToFastBytes fs
+bPutFZS b fs = bPutBS b $ fastZStringToByteString fs
 
 bPutFB :: BufHandle -> FastBytes -> IO ()
-bPutFB b@(BufHandle buf r hdl) fb@(FastBytes len fp) =
- withForeignPtr fp $ \ptr -> do
+bPutFB b (FastBytes len fp) =
+ withForeignPtr fp $ \ptr -> bPutCStringLen b (castPtr ptr, len)
+
+bPutBS :: BufHandle -> ByteString -> IO ()
+bPutBS b bs = BS.unsafeUseAsCStringLen bs $ bPutCStringLen b
+
+bPutCStringLen :: BufHandle -> CStringLen -> IO ()
+bPutCStringLen b@(BufHandle buf r hdl) cstr@(ptr, len) = do
   i <- readFastMutInt r
   if (i + len) >= buf_size
-       then do hPutBuf hdl buf i
-               writeFastMutInt r 0
-               if (len >= buf_size) 
-                   then hPutBuf hdl ptr len
-                   else bPutFB b fb
-       else do
-               copyBytes (buf `plusPtr` i) ptr len
-               writeFastMutInt r (i+len)
+        then do hPutBuf hdl buf i
+                writeFastMutInt r 0
+                if (len >= buf_size)
+                    then hPutBuf hdl ptr len
+                    else bPutCStringLen b cstr
+        else do
+                copyBytes (buf `plusPtr` i) ptr len
+                writeFastMutInt r (i + len)
 
 bPutLitString :: BufHandle -> LitString -> FastInt -> IO ()
 bPutLitString b@(BufHandle buf r hdl) a len_ = a `seq` do
diff --git a/compiler/utils/FastString.lhs b/compiler/utils/FastString.lhs
index fafb52c..03a36f2 100644
--- a/compiler/utils/FastString.lhs
+++ b/compiler/utils/FastString.lhs
@@ -31,7 +31,7 @@ module FastString
         mkFastStringFastBytes,
         foreignPtrToFastBytes,
         fastStringToFastBytes,
-        fastZStringToFastBytes,
+        fastZStringToByteString,
         mkFastBytesByteList,
         unsafeMkFastBytesString,
         bytesFB,
@@ -108,6 +108,9 @@ import FastFunctions
 import Panic
 import Util
 
+import Data.ByteString (ByteString)
+import qualified Data.ByteString.Char8  as BS
+import qualified Data.ByteString.Unsafe as BS
 import Foreign.C
 import GHC.Exts
 import System.IO
@@ -164,8 +167,8 @@ mkFastStringFastBytes (FastBytes len fp)
 fastStringToFastBytes :: FastString -> FastBytes
 fastStringToFastBytes f = fs_fb f
 
-fastZStringToFastBytes :: FastZString -> FastBytes
-fastZStringToFastBytes (FastZString fb) = fb
+fastZStringToByteString :: FastZString -> ByteString
+fastZStringToByteString (FastZString bs) = bs
 
 mkFastBytesByteList :: [Word8] -> FastBytes
 mkFastBytesByteList bs =
@@ -228,21 +231,20 @@ hPutFB handle (FastBytes len fp)
 
 -- 
-----------------------------------------------------------------------------
 
-newtype FastZString = FastZString FastBytes
+newtype FastZString = FastZString ByteString
 
 hPutFZS :: Handle -> FastZString -> IO ()
-hPutFZS handle (FastZString fb) = hPutFB handle fb
+hPutFZS handle (FastZString bs) = BS.hPut handle bs
 
 zString :: FastZString -> String
-zString (FastZString (FastBytes n_bytes buf)) =
-    inlinePerformIO $ withForeignPtr buf $ \ptr ->
-        peekCAStringLen (castPtr ptr, n_bytes)
+zString (FastZString bs) =
+    inlinePerformIO $ BS.unsafeUseAsCStringLen bs peekCAStringLen
 
 lengthFZS :: FastZString -> Int
-lengthFZS (FastZString fb) = lengthFB fb
+lengthFZS (FastZString bs) = BS.length bs
 
 mkFastZStringString :: String -> FastZString
-mkFastZStringString str = FastZString (unsafeMkFastBytesString str)
+mkFastZStringString str = FastZString (BS.pack str)
 
 -- 
-----------------------------------------------------------------------------
 



_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to