diff --git a/timing/Main.hs b/timing/Main.hs
new file mode 100644
--- /dev/null
+++ b/timing/Main.hs
@@ -0,0 +1,51 @@
+module Main where
+
+import System.Environment(getArgs)
+import System.Exit
+import Control.Monad(when)
+import Data.Default(def)
+import Data.Time
+import Data.Algorithm.TSNE
+
+
+
+main :: IO ()
+main = do
+    putStrLn "Haskell tSNE Timing"
+
+    args <- getArgs
+    let argc = length args
+    when (argc < 1 || argc > 2) $ do
+        putStrLn "Usage haskell_tsne_timing {input file name} [{num input values}]"
+        exitFailure
+
+    let inputFileName = head args
+    inputData <- readDataFile inputFileName
+
+    let n = length inputData
+    putStrLn $ "total input: " ++ show n
+
+    let n' = if (argc < 2) then n else (read (args !! 1)) 
+
+    putStrLn $ "using: " ++ show n'
+
+    t0 <- getCurrentTime
+    forTsne3D (outputResult t0) def $ take n' inputData
+    
+readDataFile :: FilePath -> IO [[Double]]
+readDataFile f = do
+    d <- readFile f
+    return $ map read (lines d)
+
+outputResult :: UTCTime -> TSNEOutput3D -> IO ()
+outputResult t0 s = do
+    let i = tsneIteration3D s
+
+    when (i > 0 && (i == 1 || i `mod` 100 == 0)) $ do 
+        putStrLn $ "iteration: " ++ show i
+        t <- getCurrentTime
+        let dt = diffUTCTime t t0
+            ms = round $ 1000.0 * realToFrac dt / realToFrac i
+        putStrLn $ "  elapsed time: " ++ show dt
+        putStrLn $ "  average iteration time: " ++ show ms ++ "ms"
+
diff --git a/tsne.cabal b/tsne.cabal
--- a/tsne.cabal
+++ b/tsne.cabal
@@ -1,5 +1,5 @@
 name:                tsne
-version:             1.1.0
+version:             1.2.0
 synopsis:            t-SNE
 description:         Pure Haskell implementation of the t-SNE dimension reduction algorithm.
 homepage:            https://bitbucket.org/robagar/haskell-tsne
@@ -49,6 +49,17 @@
   build-depends:       base,
                        data-default,
                        pipes,
+                       tsne
+  ghc-options:         -threaded
+  default-language:    Haskell2010
+
+executable haskell_tsne_timing
+  hs-source-dirs:      timing
+  main-is:             Main.hs
+  build-depends:       base,
+                       data-default,
+                       pipes,
+                       time,
                        tsne
   ghc-options:         -threaded
   default-language:    Haskell2010
