3

私は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を私のようなコードにコンパイルするように強制できますか?または他の解決策はありますか?

ありがとうございました。

4

2 に答える 2

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) {

HEAPSの方が優れているわけではありませんが、おそらく少しです。

于 2013-02-05T21:26:37.273 に答える
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には、CSファイルにリテラルJSを挿入するための構文があります。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

于 2013-02-05T19:16:56.300 に答える