2013-02-05 88 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