0

我有一个带有数组的结构,这些数组通常需要复制并且可能非常大。

struct XYZ
{
   ...
   double *x, *y, *z;
   uint count;
};

现在 Daniel Vik 在他的博客中...

http://www.danielvik.com/2010/02/fast-memcpy-in-c.html

...将此代码表示为在 c++ 中复制连续数组的更快方法(它是更快,因为它缺少 memcpy 的错误检查和一些特殊条件的东西):

void* memcpy(void* dest, const void* src, size_t count) {
    char* dst8 = (char*)dest;
    char* src8 = (char*)src;
    --src8;
    --dst8;

    while (count--) {
        *++dst8 = *++src8;
    }
    return dest;
}

我已经对此进行了一些调整,因为我知道我的类型并且通常count----count返回新副本更昂贵。所以我的结果是:

struct XYZ
{
   void Copy(XYZ & dest) 
   {
        size_t len = count * sizeof(double)+1;
        char* dest8_x = (char*)dest.x;
        char* dest8_y = (char*)dest.y;
        char* dest8_z = (char*)dest.z;
        char* src8_x = (char*)x;
        char* src8_y = (char*)y;
        char* src8_z = (char*)z;
        --dest8_x;
        --dest8_y;
        --dest8_z;
        --src_x;
        --src_y;
        --src_z;
        while (--len)
        {
            *++dest8_x = *++src8_x;
            *++dest8_y = *++src8_y;
            *++dest8_z = *++src8_z;
        }
    }

   ...
   double *x, *y, *z;
   uint count;
};

现在我有几个关于充分利用这个策略的问题:

  1. 如果我复制到 2 个目标...比如说XYZ & dest1XYZ & dest2相同的内存*this,交错它们或复制一个结构的所有成员然后下一个结构会更有效吗?
  2. 如果我想应用一些缩放因子double coefficientAdouble offsetB通过加法或乘法到一个值或一系列值,是否可以更有效地将其合并到我的复制操作中。

为了给优化的愿望提供一个简短的理由,有时count>100000对于我的程序的给定运行,并且通常我对复制的一组坐标做的第一件事就是向所有坐标添加一个选定的值。

4

1 回答 1

1

这真的应该是一个评论,虽然它看起来太大了。

首先,为什么要一次复制 1 个字节,而你可以做 16 个!?接下来,我注意到您同时使用了缩放和偏移——这是 3d/2d 图形中的两种常见操作。我想知道那里使用的方法是否更合适 - 即存储坐标和单独的转换矩阵。这可以完全消除复制坐标的需要。您可能需要考虑缓存。移动大量数据可能会破坏它。此外,假设您需要在每个周期对双打执行其他操作,您会发现将它们加载到 fpu 寄存器中,然后转换然后使用它们(每帧/周期)比加载、更改、保存到新位置(不确定重复rate),然后加载和使用它们(每帧/周期)-我不禁认为这听起来像是善意但过早的优化。

老实说,我认为如果没有更深入地了解它的细节,就不可能给你一个关于优化你的特定程序的明确答案。但无论如何,复制 3 个双精度的结构,一次一个字节是不可能的!

于 2013-10-17T01:42:55.713 回答