2013-02-05 64 views
3

我有一个CoffeeScript的代码CoffeeScript的效率

for y in [coY - limit .. coY + limit] 
    for x in [coX - limit .. coX + limit] 

我一直在寻找方法如何提高我的代码的速度和找到了它编译成:

for (y = _i = _ref = coY - limit, _ref1 = coY + limit; _ref <= _ref1 ? _i <= _ref1 : _i >= _ref1; y = _ref <= _ref1 ? ++_i : --_i) { 
    for (x = _j = _ref2 = coX - limit, _ref3 = coX + limit; _ref2 <= _ref3 ? _j <= _ref3 : _j >= _ref3; x = _ref2 <= _ref3 ? ++_j : --_j) { 

当我替换了我自己的JavaScript

for(y = coY - limit; y <= coY + limit; y++) { 
    for(x = coX - limit; x <= coX + limit; x++) { 

我测量脚本显着更快(从25到15毫秒)。我能以某种方式强迫CoffeeScript编译成类似于我的代码吗?还是有其他解决方案?

谢谢。

+1

[在CoffeeScript的简单循环]的可能重复(http://stackoverflow.com/questions/10246422/simple-loop-in-coffeescript) – Chuck

+0

是的。不幸的是,在问这个问题之前,我无法找到这个问题。 – ondrejsl

+0

不用担心。这是一个棘手的问题寻找。如果我不确切知道我在找什么,我怀疑我会找到它。您的重复问题只是意味着现在有更好的机会在将来有人会以正确的搜索条件发生。 – Chuck

回答

3

假设你的循环将总是从一个较小的数字去比较大的数字,你可以使用by 1

for y in [coY - limit .. coY + limit] by 1 
    for x in [coX - limit .. coX + limit] by 1 

哪编译为:

for (y = _i = _ref = coY - limit, _ref1 = coY + limit; _i <= _ref1; y = _i += 1) { 
    for (x = _j = _ref2 = coX - limit, _ref3 = coX + limit; _j <= _ref3; x = _j += 1) { 

这不是更好,但可能有点。

1

我不知道哥们,你编辑的代码编译成这对我来说:

// Generated by CoffeeScript 1.4.0 
var x, y, _i, _j, _ref, _ref1, _ref2, _ref3; 

for (y = _i = _ref = coY - limit, _ref1 = coY + limit; _i <= _ref1; y = _i += 1) { 
    for (x = _j = _ref2 = coX - limit, _ref3 = coX + limit; _j <= _ref3; x = _j += 1) { 
    } 
} 

为了得到它完全像你想的那样,你可能只是实际上它使用JavaScript编写。幸运的是,CoffeeScript具有将文字JS插入CS文件的语法。如果你用反引号(`)包围JS,CS编译器将把它包含在输出中,但它不会以任何方式改变反引号中的内容。

下面是一个例子:

console.log "regular coffeescript" 

#surround inline JS with backticks, like so: 
`for(y = coY - limit; y <= coY + limit; y++) { 
    for(x = coX - limit; x <= coX + limit; x++) { 
    console.log('inline JS!'); 
    } 
}` 

console.log "continue writing regular CS after" 

来源:http://coffeescript.org/#embedded