1

我想知道是否有人知道或拥有这些准确的速度测试之一可以测试 Actionscript 3 中的“不小于”与“大于或等于”速度(如果有区别的话,Air 2.5)?

我在这台计算机上运行了虚拟机,但得到的结果非常不准确。

像这样使用它

if ( !(__index < _vector.length) ) return;

或者

if ( __index >= _vector.length ) return;

我会想到第一个,因为它所做的只是 1 次测试然后反转它,但是 actionscript 3 有一些你永远无法确定的怪癖。

4

3 回答 3

4

理论上应该没有速度差异。ActionScript 使用 nanojit JIT 库来编译代码,我知道一个事实(之前曾在 Mozilla 的 JavaScript 引擎中处理过该代码,该引擎与 Adob​​e 的 ActionScript 共享 nanojit)实现比较的代码将转换简单的转换,如比较的反转进入逆向比较。所以理论上唯一的区别是编译代码花费了另一个或两个周期。这不值得担心。

另一方面,现代 CPU 是复杂的野兽,极小的扰动可以产生显着的差异。因此,虽然我认为两者之间没有区别,但我不会把农场赌在这上面。

于 2011-02-04T10:14:58.400 回答
2

您的问题更多地涉及计算机科学,而不是动作脚本,因为大多数语言都会尝试编译为尽可能最佳的机器代码。

因此,我将使用 C++ 示例来回答您的问题。

int j = 16;
if (!(j < 10))
{
    int l = 3;
}

if (j >= 10)
{
    int l = 3;
}

这会在汇编中产生以下关键部分:

00231375  cmp         dword ptr [j],0Ah  
00231379  jl          wmain+32h (231382h)  
0023137B  mov         dword ptr [l],3  
00231382  cmp         dword ptr [j],0Ah  
00231386  jl          wmain+3Fh (23138Fh)  
00231388  mov         dword ptr [l],3  
0023138F  xor         eax,eax  

第 00231375 和 00231382 行是 if 语句中包含的实际测试。如您所见,我的 < 和 >= 测试都在汇编中编译为相同的相同代码(比较两个整数时)。因此,任何一个测试都将在 CPU 上花费相同的时间,因为它们都导致相同的测试(如果 left < right,则跳过 if block)。动作脚本编译器很可能就是这种情况。

但是,一个问题可能是 JIT 编译器是否需要更长的时间来编译 !([int] < [int]) 或 [int] >= [int]。我的猜测是,差异可能还不够重要。

于 2011-02-04T10:28:16.653 回答
-1

做一个循环并使用 getTimer() 来发现。尝试这样的事情:

var startTime:int = getTimer()
var count:int = 1000000
for (var i:int = 0;i<count;i++) {

    if ( !(__index < _vector.length) ){

    }
}
trace("The first script took "+String(getTimer()-startTime) + "ms to run")



startTime = getTimer()
for (i = 0;i<count;i++) {

    if ( __index <= _vector.length ){

    }
}
trace("The second script took "+String(getTimer()-startTime) + "ms to run")

此外,如果您使用这种技术得到不准确的结果,请尝试使计数变量更大。如果您只需要检查“>”和“>=”性能,则从循环中删除“_vector.lenght”验证可能很有用

于 2011-02-07T19:21:39.727 回答