Điều này hoàn toàn tương tác và có một sự thật, tập lệnh cà phê không thể hoạt động nhanh hơn javascript được tối ưu hóa hoàn toàn.
Điều đó nói rằng, vì tập lệnh cà phê đang tạo javascript. Có nhiều cách để làm cho nó đáng giá. Đáng buồn thay, nó không có vẻ là trường hợp được nêu ra.
Hãy lấy ví dụ:
new_way = -> [0..1000000]
new_way()
Nó biên dịch này với kịch bản cà phê 1.6.2
// Generated by CoffeeScript 1.6.2
(function() {
var new_way;
new_way = function() {
var _i, _results;
return (function() {
_results = [];
for (_i = 0; _i <= 1000000; _i++){ _results.push(_i); }
return _results;
}).apply(this);
};
new_way();
}).call(this);
Và mã được cung cấp bởi clockworkgeek là
function oldway()
{
var a = [];
for (var i = 0; i <= 1000000; i++)
a[i] = i;
return a;
}
oldway()
Nhưng kể từ khi kịch bản cà phê ẩn các chức năng bên trong một phạm vi, chúng ta nên làm điều đó cho javascript quá. Chúng tôi không muốn làm cong cửa sổ phải không?
(function() {
function oldway()
{
var a = [];
for (var i = 0; i <= 1000000; i++)
a[i] = i;
return a;
}
oldway()
}).call(this);
Vì vậy, ở đây chúng tôi có mã thực hiện điều tương tự. Và sau đó chúng tôi muốn thực sự thử nghiệm cả hai phiên bản một vài lần.
kịch bản Coffee
for i in [0..100]
new_way = -> [0..1000000]
new_way()
tạo JS, và bạn có thể tự hỏi mình những gì đang diễn ra ở đó ??? Nó tạo ra i
và _i
vì bất kỳ lý do gì. Rõ ràng với tôi từ hai điều này, chỉ có một là cần thiết.
// Generated by CoffeeScript 1.6.2
(function() {
var i, new_way, _i;
for (i = _i = 0; _i <= 100; i = ++_i) {
new_way = function() {
var _j, _results;
return (function() {
_results = [];
for (_j = 0; _j <= 1000000; _j++){ _results.push(_j); }
return _results;
}).apply(this);
};
new_way();
}
}).call(this);
Bây giờ chúng ta sẽ cập nhật Javascript của mình.
(function() {
function oldway()
{
var a = [];
for (var i = 0; i <= 1000000; i++)
a[i] = i;
return a;
}
var _i;
for(_i=0; _i <= 100; ++_i) {
oldway()
}
}).call(this);
Vì vậy, các kết quả:
time coffee test.coffee
real 0m5.647s
user 0m0.016s
sys 0m0.076s
time node test.js
real 0m5.479s
user 0m0.000s
sys 0m0.000s
Các js mất
time node test2.js
real 0m5.904s
user 0m0.000s
sys 0m0.000s
Vì vậy, bạn có thể tự hỏi mình ... những gì cà phê kịch bản địa ngục là nhanh hơn ??? và sau đó bạn nhìn vào mã và tự hỏi mình ... vì vậy hãy cố gắng khắc phục điều đó!
(function() {
function oldway()
{
var a = [];
for (var i = 0; i <= 1000000; i++)
a.push(i);
return a;
}
var _i;
for(_i=0; _i <= 100; ++_i) {
oldway()
}
}).call(this);
Sau đó chúng tôi sẽ làm một sửa chữa nhỏ để kịch bản JS và thay đổi a[i] = i
-a.push(i)
Và sau đó cho phép thử lại ... và sau đó BOOM
time node test2.js
real 0m5.330s
user 0m0.000s
sys 0m0.000s
thay đổi nhỏ này đã làm cho nó nhanh hơn so với chúng tôi CoffeeScript Bây giờ cho phép nhìn vào CoffeeScript tạo ... và loại bỏ các biến đôi ...
này:
// Generated by CoffeeScript 1.6.2
(function() {
var i, new_way;
for (i = 0; i <= 100; ++i) {
new_way = function() {
var _j, _results;
return (function() {
_results = [];
for (_j = 0; _j <= 1000000; _j++){ _results.push(_j); }
return _results;
}).apply(this);
};
new_way();
}
}).call(this);
và BOOM
time node test.js
real 0m5.373s
user 0m0.000s
sys 0m0.000s
Vâng những gì tôi đang cố gắng để nói là có những lợi ích tuyệt vời để sử dụng một ngôn ngữ cao hơn. CoffeeScript được tạo không được tối ưu hóa. Nhưng không xa mã js thuần túy. Mã tối ưu hóa mà clockworkgeek
đã cố gắng sử dụng với việc sử dụng chỉ mục trực tiếp thay vì đẩy thực sự dường như ngược lại và làm việc chậm hơn so với coffeescript được tạo ra.
Sự thật rằng loại tối ưu hóa như vậy có thể khó tìm và sửa chữa. Mặt khác, từ phiên bản này sang phiên bản khác, coffeescript có thể tạo mã js được tối ưu hóa cho trình duyệt hoặc trình thông dịch hiện tại. CoffeeScript sẽ không thay đổi nhưng có thể được tạo lại để tăng tốc mọi thứ.
Nếu bạn viết trực tiếp bằng javascript, bây giờ có cách để thực sự tối ưu hóa mã càng nhiều càng tốt với một trình biên dịch thực.
Một phần thú vị khác là một ngày, CoffeeScript hoặc các trình tạo khác có thể được sử dụng để phân tích mã (như jslint) và loại bỏ các phần của mã mà một số biến không cần thiết ... các đối số để tăng tốc độ khi không cần một số biến. Nếu bạn có purejs, bạn sẽ phải mong đợi rằng có một trình biên dịch JIT sẽ làm công việc đúng và tốt cho coffeescript.
Ví dụ: tôi có thể tối ưu hóa tập lệnh cà phê lần cuối .. khi xóa new_way = (function...
từ bên trong vòng lặp for. Một lập trình viên thông minh sẽ biết rằng điều duy nhất xảy ra ở đây là tái tạo chức năng trên mỗi vòng lặp mà không thay đổi biến. Hàm được tạo trong phạm vi hàm và không được tạo lại trên mỗi vòng lặp. Điều đó nói rằng nó không nên thay đổi nhiều ...
time node test.js
real 0m5.363s
user 0m0.015s
sys 0m0.000s
Vì vậy, điều này là khá nhiều.
Chức năng không phổ biến nào mà CoffeeScript sử dụng? –
"JavaScript chính nó là xấu" -> sai. – Raynos
Tôi đồng ý với Raynos: mã xấu là mã không hợp lệ và có thể được viết bằng bất kỳ ngôn ngữ nào. – calvinf