Tôi có một chương trình ClojureScript chủ yếu thực hiện các phép tính toán trên các bộ sưu tập. Nó được phát triển trong Clojure độc lập, độc lập, vì vậy rất dễ dàng để chuẩn bị nó. Trước sự ngạc nhiên của tôi (và trái với những gì các câu trả lời sẽ gợi ý cho Which is faster, Clojure or ClojureScript (and why)?), cùng một mã trong ClojureScript chạy chậm hơn 5-10 lần so với tương đương Clojure của nó.Cải thiện hiệu suất của chương trình ClojureScript
Đây là những gì tôi đã làm. Tôi đã mở lein repl
và trình duyệt được phát lại tại http://clojurescript.net/. Sau đó, tôi đã thử các đoạn mã này trong cả hai REPL.
(time (dotimes [x 1000000] (+ 2 8)))
(let [coll (list 1 2 3)] (time (dotimes [x 1000000] (first coll))))
Sau đó, tôi mở một giao diện điều khiển javascript tại repl trình duyệt và viết một hàm chuẩn tối giản,
function benchmark(count, fun) {
var t0 = new Date();
for (i = 0; i < count; i++) {
fun();
}
var t1 = new Date();
return t1.getTime() - t0.getTime();
}
Quay lại trình duyệt REPL:
(defn multiply [] (* 42 1.2))
Sau đó thử cả javascript mẹ đẻ phép nhân và biến thể clojurescript của nó trong bảng điều khiển javascript,
benchmark(1000000, cljs.user.multiply);
benchmark(1000000, function(){ 42 * 1.2 });
Những gì tôi thấy
- Native toán javascript được so sánh với toán học trong clojure
- ClojureScript là chậm hơn 5-10 lần so với một trong hai chúng
Bây giờ câu hỏi của tôi là, làm thế nào thế nào tôi có thể cải thiện hiệu suất của chương trình ClojureScript của tôi?
Có một số cách tiếp cận tôi đã xem xét cho đến nay
- Mùa thu trở lại sử dụng các mảng javascript có thể thay đổi và các đối tượng đằng sau hậu trường. (Điều này có thể được không?)
- Quay lại sử dụng toán tử toán học javascript gốc. (Đây có phải là có thể ở tất cả?)
- Sử dụng javascript mảng một cách rõ ràng với
(aget js/v 0)
- Sử dụng thực hiện ít tham vọng của clojure-cho-javascript, như https://github.com/chlorinejs/chlorine hoặc https://github.com/gozala/wisp Họ tạo ra một javascript nhiều thành ngữ, nhưng họ không hỗ trợ namespace mà tôi đang sử dụng rất nhiều.
Tôi nghĩ bạn đã có chuẩn phổ ở ClojureScript ở đâu đó! +1 cho điều đó. –