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 具有将文字 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

于 2013-02-05T19:16:56.300 回答