C ++通过多次重复向量来构建数据数组

时间:2013-09-12 23:30:03

标签: c++ performance

我有一系列数字需要重复多次,并将重复数据作为指向大小(实际上是元素数)的数据的指针。我需要将这些数据传递给API。

分配内存的最有效方法是什么,传递重复的数据然后再次释放它。我目前有一个需要重复存储在std :: vector

中的序列

我有几个想法:

// Setup code
unsigned int repeat = 30000;
std::vector<int> datavector(5, 0); // assume this would contain arbitrary numbers that needed to be repeated

// Idea 1:
{
    unsigned int byte_size_step = datavector.size() * sizeof(int);
    unsigned int byte_full_size = byte_size_step * repeat;
    int *ptr = malloc(byte_full_size);

    for(unsigned int i=0; i<repeat; i++)
    {
        memcpy(ptr+(i*byte_size_step), datavector.data(),  byte_size_step);
    }
    apiFunc(ptr); // apiFunc copies the data
    free(ptr)
}

// Idea 2:
{
    std::vector datarepeated(datavector.size()*repeat);
    for(unsigned int i=0; i<repeat; i++)
    {
        datarepeated.insert(datarepeated.begin()+(i*size_step), datavector.begin(), datavector.end());
    }
    apiFunc(datarepeated.data());
}

虽然我觉得有一种功能或易于使用的方法可以快速重复内存中的序列。我可能错过了一些东西。我个人不知道这样的事情是否可以从多线程解决方案中受益。

欢迎任何提示(大多数)高效率的提示。

1 个答案:

答案 0 :(得分:2)

你的想法应该有非常相似的表现。但是,您可以通过最小化循环迭代/ memcpy调用的数量来减少更多性能,您可以通过加倍每次迭代的长度来完成。像这样:

// Setup code
const size_t repeat = 10;
int data[] = {1, 2, 3, 4, 5};
vector<int> datavec(data, data+5);

// initialize and copy initial segment
vector<int> datarepeated(datavec.size() * repeat);
memcpy(&datarepeated[0], &datavec[0], datavec.size()*sizeof(int));
size_t num_copied = datavec.size();
size_t num_total = datarepeated.size();

// double the amount copied at each iteration
while(num_copied*2 <= num_total) {
    memcpy(&datarepeated[num_copied], &datarepeated[0], num_copied*sizeof(int));
    num_copied *= 2;
}

// copy the final bit
if(num_copied < num_total)
    memcpy(&datarepeated[num_copied], &datarepeated[0], (num_total-num_copied)*sizeof(int));

您可以在行动here中看到它。

编辑:当然,你可以尝试改变你的复制方式(例如,而不是memcpy,使用std::copy与评论中建议的back_inserter一起使用{} while循环。我试图表达的关键想法是重复加倍。无论您最终尝试什么,请务必 基准