程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在制作大缓冲区时,使用 malloc 分配缓冲区是否比使用静态分配的缓冲区更快?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在制作大缓冲区时,使用 malloc 分配缓冲区是否比使用静态分配的缓冲区更快??

开发过程中遇到在制作大缓冲区时,使用 malloc 分配缓冲区是否比使用静态分配的缓冲区更快?的问题如何解决?下面主要结合日常开发的经验,给出你关于在制作大缓冲区时,使用 malloc 分配缓冲区是否比使用静态分配的缓冲区更快?的解决方法建议,希望对你解决在制作大缓冲区时,使用 malloc 分配缓冲区是否比使用静态分配的缓冲区更快?有所启发或帮助;

我正在尝试制作这样的数组:

char tmp[4][32768];
//code

这是在一个函数中,我发现使这个数组全局化会提高程序的速度(不幸的是我不能保持这样,因为函数在遇到某些数据时会递归调用自身)。我想让这个函数更快,但我读到 @H_958_5@malloc 可能很慢。那么,保持这样或这样做会更快吗?:

char** tmp;
tmp = malloc(4 * sizeof(char*));
tmp[0] = malloc(32768);
tmp[1] = malloc(32768);
tmp[2] = malloc(32768);
tmp[3] = malloc(32768);
//code
free(tmp[0]);
free(tmp[1]);
free(tmp[2]);
free(tmp[3]);
free(tmp);

解决方法

这不是更快或更慢的问题。关键是你有没有炸毁筹码。

您正在创建一个大小为 128K 的数组,这对于局部变量来说相当大,而局部变量通常存在于堆栈中。如果您递归调用此函数,则每次调用的堆栈上还有 128K。只需几次递归调用就足以导致堆栈溢出,从而可能导致崩溃。

动态分配内存几乎是您唯一的选择。但是,您可以将其减少为单个分配:

char (*tmp)[32768] = malloc(4 * sizeof *tmp);

这种分配是有效的,因为 char [4][32768] 类型的二维数组衰减为 char (*)[32768] 类型的指针,该指针与上面的 tmp 类型匹配。 @H_958_5@malloc 返回的内存足以容纳 4 个 char[32768] 类型的对象。该内存是连续的,不像为每个子数组对 @H_958_5@malloc 进行 4 次单独调用。

,

在所有条件相同的情况下,通过 @H_958_5@malloc(或 callocrealloc)分配内存比使用 auto ( local) 数组,这会比使用 static 数组慢。

不过,所有事物通常都不是平等的。正如您所发现的,static 数组在处理递归时不能很好地工作(或者当您只需要保留多个状态时,就像任何试图使用 strtok 来标记字符串的人一样 "a=b&c=d&e=f" {1}} 非常清楚)。一个 128K auto 数组有点大,如果函数是递归的,这可能是一个问题,因为堆栈空间对于单个进程通常是有限的。

这是动态内存的理想用例,它通常不像堆栈上的内存那样有限。权衡是替代方案会更慢,并且需要您做更多的工作。

究竟慢多少取决于你如何分配和使用它 - 将它分配为一个连续的块,就像这样只需要一个 @H_958_5@malloc(和相应的 free)调用,并且应该更适合地区:

char (*tmp)[32768] = malloc( 4 * sizeof *tmp );
if ( tmp )
{
  for ( size_t i = 0; i < 4; i++ )
    strcpy( tmp[i],some_String ); // or however you intend to use tmp;
  ...
  free( tmp );
}

但如果您的堆足够碎片化,您可能无法将其分配为单个连续块,而必须使用多个 @H_958_5@malloc(和 free)调用逐个进行:

char **tmp = malloc( 4 * sizeof *tmp );
if ( tmp )
{
  for ( size_t i = 0; i < 4; i++ )
  {
    tmp[i] = malloc( sizeof *tmp[i] * 32768 );
    if ( tmp[i] )
    {
      strcpy( tmp[i],some_String );
    }
  }
  ...
  for ( size_t i = 0; i < 4; i++ )
    free( tmp[i] );
  free( tmp );
}

确定哪个更快、更适合您的目的的唯一方法是编写多个版本并衡量它们的性能。

说了这么多...

如果你的代码做错了事,或者给出了错误的答案,或者在出现错误输入的第一个暗示时吐了一地,或者暴露了敏感数据,或者提供了一个入口点,那么你的代码有多快都无关紧要用于恶意软件,或无法修改或维护。代码的正确性和可维护性首先,不虑原始执行速度,然后是上面列出的所有其他问题。除非您有严格的性能要求(“此操作必须在 X 毫秒内完成”),否则不要担心速度。先做对,然后如果您不满意,您可以随时调整性能。

此外,根据代码其余部分的作用,分配和管理该内存的不同方法之间的差异可能微不足道 - 如果您的代码花费大量时间等待某人输入数据,那么使用 @H_958_5@malloc 而不是 auto 数组花费的额外几个时钟真的无关紧要。另一方面,如果您在紧密循环中调用此代码数千次,这些额外的时钟加起来就会产生显着差异。

根据分析测量做出决定,而不是猜测。

大佬总结

以上是大佬教程为你收集整理的在制作大缓冲区时,使用 malloc 分配缓冲区是否比使用静态分配的缓冲区更快?全部内容,希望文章能够帮你解决在制作大缓冲区时,使用 malloc 分配缓冲区是否比使用静态分配的缓冲区更快?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。