提高循环的速度很少,几乎没有动作:)



我已经开始使用免费的pascal delphi version lazarus。而且...今天的计算机在一个CPU周期中处理了很多字节...这使我陷入了问题和问题。

我有一个紧密的循环,我想在其中移动一系列字节的一部分,总是只用一个字节。考虑代码:

LowBound := 7;
HighBound := 245; // Always the last record in the array.
// Shrink the array
For x := LowBound to Highbound-1 DO ByteArray[x] := ByteArray[x+1];
SetLength(ByteArray,HIGH(ByteArray)); // Shrinks the array by one.
// Next Part as an example of my Expanding.
LowBound := 18;
HighBound := 207; // Always the last record in the array.
SetLength(ByteArray,HIGH(ByteArray)+2); // Expands the array by one.
For x := HighBound DownTo LowBound DO ByteArray[x+1] := ByteArray[x];

假设32位代码可以在每个CPU循环上移动4个字节,而64位代码可以在一个CPU循环中移动8个字节,那么我的简单1个字节在一个时间似乎根本不是有效的。

也许将阵列铸造为红衣主教(32位)或INT64(64位)的数组,然后进行一些移动/移动?有人对此有想法吗?感谢答案,莫滕。

在意识到移动功能

之后

我已经完成了一些实验 - >循环与此移动功能相比。我在字节上的工作被暂停了,因为我还不能让我的例程上班,所以我对红衣主教阵列进行了一些测试。

首先,我制作了两个阵列1000 000(100万)个红衣主教。第二,我用随机数填充第一个数组(不到1秒)第三,我使用第二个数组对此数组进行了索引,因此使用第二个数组对数字进行排序。这是我的结果:

  1. 使用 - >进行移动索引的循环,总时间:11M33S
  2. 使用函数移动来移动索引,总时间:2M 2S

没有详细介绍我的分类例程,事实仍然是,该指数的变量部分被转移了1个位置接近1000 000(100万)次。就CPU循环而言,使用循环做到这一点非常非常昂贵。

在不断移动数据的情况下,值得研究移动功能的时间。


移动功能的速度几乎是循环速度的6倍。

注意:由于移动功能会移动指定数量的字节,因此要移动的记录量必须乘以4。cardinal = 4个字节。

VAR
  DataArray : ARRAY [0..100] OF Cardinal;
Move(DataArray[5],DataArray[6],4); // Equals: DataArray[6] := DataArray[5];
Move(DataArray[5],DataArray[6],(100-5)*4); // Shifts the whole array from pos 5 one position up.

相关内容

最新更新