performance measurements

Each table row shows performance measurements for this Clojure program with a particular command-line input value N.

 N  CPU secs Elapsed secs Memory KB Code B ≈ CPU Load
5003.321.5847,260762  52% 60% 55% 45%
3,00015.524.7750,088762  78% 82% 87% 80%
5,50042.8811.5849,756762  92% 95% 93% 91%

Read the ↓ make, command line, and program output logs to see how this program was run.

Read spectral-norm benchmark to see what this program should do.


java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) Server VM (build 25.25-b02, mixed mode)

Clojure 1.6.0

 spectral-norm Clojure #7 program source code

;; The Computer Language Benchmarks Game
;; contributed by Jim Kannampuzha
;; inspired by Jesse Rosenstock

(ns spectralnorm

(set! *warn-on-reflection* true)

(defmacro eval-a [i j]
  `(let [n# (unchecked-add ~i ~j)
         nn+1# (unchecked-multiply n# (unchecked-inc n#))]
     (/ (double 1.0) (unchecked-add (bit-shift-right nn+1# 1)
				    (unchecked-inc ~i)))))

(defn multiply-a-v [agent ^doubles v ^doubles av range]
  (let [end (int (second range))]
    (loop [i (int (first range))]
      (if (= i end)
	  (aset av i (double (areduce v j sum (double 0)
				      (+ sum (* (eval-a i j) (aget v j))))))
	  (recur (unchecked-inc i)))))))

(defn multiply-at-v [agent ^doubles v ^doubles atv range]
  (let [end (int (second range))]
    (loop [i (int (first range))]
      (if (= i end) 
	  (aset atv i (double (areduce v j sum (double 0)
				       (+ sum (* (eval-a j i) (aget v j))))))
	  (recur (unchecked-inc i)))))))

(defn multiply-at-a-v [^doubles v ^doubles tmp ^doubles at-av workers ranges]
  (apply await (map #(send %1 multiply-a-v v tmp %2) workers ranges))
  (apply await (map #(send %1 multiply-at-v tmp at-av %2) workers ranges)))

(defmacro dot-product [^doubles u ^doubles v]
  `(areduce ~u i# sum# (double 0) (+ sum# (* (aget ~u i#) (aget ~v i#)))))

(defn run-game [size]
  (let [num-threads (.availableProcessors (Runtime/getRuntime))
        workers (vec (repeatedly num-threads #(agent ())))
        chunk-size (int (Math/ceil (/ size num-threads)))
        ranges  (vec (partition 2 1 (take (inc num-threads)
                                          (iterate #(+ chunk-size %) 0))))
        u (double-array size 1.0)
        tmp (double-array size 0.0)
        v (double-array size 0.0)]
    (dotimes [_ 10]
      (multiply-at-a-v u tmp v workers ranges)
      (multiply-at-a-v v tmp u workers ranges))
    (Math/sqrt (/ (dot-product u v) (dot-product v v)))))

(defn -main [& args]
  (let [n (if (empty? args)
            (Integer/valueOf ^String (first args)))]
    (println (format "%.9f" (run-game n)))

 make, command-line, and program output logs

Thu, 20 Nov 2014 01:55:36 GMT

mv spectralnorm.clojure-7.clojure spectralnorm.clj
/usr/local/src/jdk1.8.0_25/bin/java -Dclojure.compile.path=. -cp .:/usr/local/src/clojure/clojure-1.6.0.jar clojure.lang.Compile spectralnorm
Compiling spectralnorm to .
1.98s to complete and log all make actions

/usr/local/src/jdk1.8.0_25/bin/java -server -XX:+TieredCompilation -XX:+AggressiveOpts -Xmx8m -cp .:/usr/local/src/clojure/clojure-1.6.0.jar spectralnorm 5500


Revised BSD license

  Home   Conclusions   License   Play