이것은 모두 매우 복잡하며 하나의 진실이 있습니다. 커피 스크립트는 완벽하게 최적화 된 자바 스크립트보다 빠르게 작동하지 않습니다.
즉, 커피 스크립트는 javascript를 생성하기 때문에. 그만한 가치가있는 방법이 있습니다. 슬프게도, 아직 그럴 것 같지 않습니다.
그것은 커피 스크립트 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);
그리고 clockworkgeek에서 제공하는 코드와이로 컴파일
new_way = -> [0..1000000]
new_way()
이
function oldway()
{
var a = [];
for (var i = 0; i <= 1000000; i++)
a[i] = i;
return a;
}
oldway()
그러나 이후입니다 :
는 예를 취할 수 있습니다 coffee 스크립트는 범위 내에서 함수를 숨기고, 우리는 자바 스크립트에서도 그렇게해야합니다. 우린 바로 창문을 드러내고 싶지 않아?
(function() {
function oldway()
{
var a = [];
for (var i = 0; i <= 1000000; i++)
a[i] = i;
return a;
}
oldway()
}).call(this);
그래서 여기에는 실제로 동일한 작업을 수행하는 코드가 있습니다. 그리고 나서 두 버전을 실제로 테스트 해보고 싶습니다.
커피 스크립트
for i in [0..100]
new_way = -> [0..1000000]
new_way()
는 JS 생성, 그리고 당신이 거기에 무슨 일이 일어나고 있는지 자신을 요청할 수 있습니다 ??? 어떠한 이유로 든 i
및 _i
을 생성합니다. 이 두 가지로부터 나에게 분명합니다. 오직 하나만 필요합니다.
// 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);
그럼 이제 자바 스크립트를 업데이트 할 예정입니다. 그래서
(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);
이 결과 :
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
JS는 도대체 커피 스크립트가 빠르다 무엇
time node test2.js
real 0m5.904s
user 0m0.000s
sys 0m0.000s
그래서 당신은 자신을 요청할 수 있습니다
를 걸립니다 ... ??? 그런 다음 코드를보고 자신에게 묻습니다. 문제를 해결해 봅시다!
(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);
우리는 다음 JS 스크립트에 작은 수정을하고 a.push(i)
-a[i] = i
을 변경 한 다음 다시 시도 할 수 있습니다 ... 그리고이 작은 변화가보다 빠르게 만들었
time node test2.js
real 0m5.330s
user 0m0.000s
sys 0m0.000s
붐 것입니다 우리의
// 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);
: 커피 스크립트는 이제 이것에
... 생성 된 커피 스크립트를 보면 ... 그 두 변수를 제거 할 수 있습니다
및 붐
time node test.js
real 0m5.373s
user 0m0.000s
sys 0m0.000s
그럼 내가 무엇을 말하려고하고있어 높은 언어를 사용하는 큰 혜택이 있다는 것입니다. 생성 된 CoffeeScript는 최적화되지 않았습니다. 하지만 순수한 js 코드에서 그렇게 멀지 않았습니다. clockworkgeek
이 밀어 넣기 대신 색인을 사용하여 실제로 사용하려고 시도한 코드 최적화는 실제로 생성 된 coffeescript보다 느리게 작동하고 역효과를내는 것처럼 보였습니다.
그런 종류의 최적화는 찾기 어렵습니다. 다른면에서, 버전에서 버전까지, coffeescript는 현재 브라우저 또는 인터프리터에 최적화 된 js 코드를 생성 할 수 있습니다. CoffeeScript는 변경되지 않은 채로 남아 있지만 속도를 높이기 위해 다시 생성 될 수 있습니다.
자바 스크립트로 직접 작성하는 경우 실제 컴파일러 에서처럼 코드를 실제로 최적화하는 방법이 있습니다.
다른 흥미로운 부분은 언젠가 CoffeeScript 나 자바 스크립트의 다른 생성기가 (jslint와 같은) 코드를 분석하고 일부 변수가 필요하지 않은 코드 부분을 제거하는 데 사용될 수 있다는 것입니다. 다른 기능을 다르게 컴파일합니다. 변수가 필요하지 않을 때 속도를 높이는 인수. purej를 사용한다면 JIT 컴파일러가 있어야하고, coffeescript에도 도움이 될 것입니다.
예를 들어 나는 for 루프 내부에서 new_way = (function...
을 제거하여 마지막으로 커피 스크립트를 최적화 할 수 있습니다. 한 스마트 프로그래머는 여기에서 일어나는 유일한 일은 변수를 변경시키지 않는 각 루프의 기능을 재사용한다는 것입니다. 이 함수는 함수 범위에서 만들어지며 각 루프에서 다시 작성되지 않습니다. 즉 그래서이 꽤 많이 있습니다 ...
time node test.js
real 0m5.363s
user 0m0.015s
sys 0m0.000s
가 많이 변경되지해야한다고 말했다.
CoffeeScript는 비표준 기능을 사용합니까? –
"JavaScript 자체가 추악합니다"-> false. – Raynos
나는 Raynos에 동의한다. 나쁜 코드는 나쁜 코드이고, 어떤 언어로도 쓸 수있다. – calvinf