比较复制内存缓冲区所用时间:memcpy 与 ForLoopIndexCopying

Comparing elapsed time to copy memory buffers: memcpy vs ForLoopIndexCopying

我试图了解缓冲区 "memcpy" 和 "for-loop-index-copying" 在复制所需时间方面的区别。

results:  
          CopyingType  |  MemoryType  |  RunMode  |  Elapsed Time(ms)
          -----------------------------------------------------------
             memcpy    |    stack     |   Debug   |          x   
       forLoopIndexing |    stack     |   Debug   |        30x
             memcpy    |    stack     |   Release |          0   
       forLoopIndexing |    stack     |   Release |          0
             memcpy    |    heap      |   Release |          0   
       forLoopIndexing |    heap      |   Release |       2000  

这是我的代码 运行...也许我做错了什么???

似乎很奇怪,复制一个 500,000 字节的缓冲区 100,000 次根本不需要时间,或者至少比机器的分辨率少...在我的例子中是 16 毫秒。

#include "stdafx.h"
#include <windows.h>
#include <iostream>

int main()
{
  long baseTime;

  const long packetLength = 500000;
  //char packet1[packetLength];//stack
  //char packet2[packetLength];//stack
  char *packet1 = (char*)calloc(packetLength, sizeof(char));//heap
  char *packet2 = (char*)calloc(packetLength, sizeof(char));//heap
  memset(packet1, 0, packetLength);//init
  memset(packet2, 0, packetLength);//init
  long NumPackets = 100000;
  long NumRuns = 10;


  for (long k = 0; k < NumRuns; k++)
  {
    //create packet
    printf("\npacket1:\n");
    for (long i = 0; i < packetLength; i++) {
      packet1[i] = (char)(i % 26 + 65);
    }

    printf("\nk:%d\n", k);

    //index copy
    baseTime = GetTickCount();
    long ii = 0;
    for (long j = 0; j < NumPackets; j++) {
      for (long i = 0; i < packetLength; i++) {
        packet2[i] = packet1[i];
      }
    }
    printf("Time(IndexCopy): %ld\n", GetTickCount() - baseTime);


    //memcpy
    memset(packet2, 0, packetLength);//reset

    baseTime = GetTickCount();
    for (long j = 0; j < NumPackets; j++) {
      memcpy(packet2, packet1, packetLength); //Changed via PaulMcKenzie.
    }
    printf("Time(memcpy): %ld\n", GetTickCount() - baseTime);


    //printf("\npacket2\n");
    for (long i = 0; i < packetLength; i++) {
      //printf("%c", packet2[i]);
    }

  }
  int iHalt;
  scanf_s("%d", &iHalt);

  return 0;
}

通过更改...新的 table

          CopyingType  |  MemoryType  |  RunMode  |  Elapsed Time(ms)
          -----------------------------------------------------------
             memcpy    |    stack     |   Debug   |          x   
       forLoopIndexing |    stack     |   Debug   |        50x
             memcpy    |    stack     |   Release |          0   
       forLoopIndexing |    stack     |   Release |          0
             memcpy    |    heap      |   Release |       2000   
       forLoopIndexing |    heap      |   Release |       2000  

Maybe I am doing something wrong ???

您在使用 memcpy.

的代码中做错了,更重要的是
const long packetLength = 500000;
char *packet1 = (char*)calloc(packetLength, sizeof(char));
char *packet2 = (char*)calloc(packetLength, sizeof(char));    
//...
for (long j = 0; j < NumPackets; j++) {
      memcpy(packet2, packet1, sizeof(packet2)); // <-- Incorrect
    }

sizeof(packet2)sizeof(char *) 相同,很可能是 4 或 8。

你想要的不是sizeof(char *),而是要复制的实际字节数。

for (long j = 0; j < NumPackets; j++) {
      memcpy(packet2, packet1, packetLength);
    }