我是计划参与发展的一个代码写在C语言为蒙特卡洛的分析复杂的问题。这个代码分配的巨大的数据组内存在加速其性能,因此提交人的代码已经选择C,而不是用C++声称,一种可以做出更快和更可靠的(关于内存泄漏)的代码C。

你同意吗?什么会是你的选择,如果你需要存储4至16GB的阵列数据在内存在计算?

有帮助吗?

解决方案

肯定C++。默认情况下,没有明显差别的两个, C++提供了一对夫妇的事情C不:

  1. 构造/析构函数。这些就让你自动化最存管理、提高可靠性。
  2. 每类分配器。这些让你优化分配的基础上如何具体对象设计和/或使用。这可以是特别有用的,如果你需要一个大号的小型对象(得到一个明显的例子)。

底线是,在这方面,C提供了绝对不可能的优势C++。在最坏的情况下,可以做同样的事情在相同的方式。

其他提示

有是C99的一个特征这是由C ++缺席和潜在地给出了在重数字运算码显著速度增益,那就是关键字restrict。如果你可以使用C ++编译器支持它,那么你就当它涉及到具有优化套件中的额外的工具。这只是一个潜在收益,但:足够的内联可以允许相同的优化,restrict多。它也有无关的内存分配。

如果代码的作者可以证明C和C ++代码分配4-16GB阵列之间的性能差异,那么(一)我很惊讶,但OK,有区别,和(b)有多少的在程序将要分配这样大的阵列?是你的程序究竟要花费它的时间分配内存的显著量,或者它花费其大部分时间的访问的记忆和做计算?这需要很长的时间来真正的的有4GB的阵列,它把分配的时间相比较,你应该担心的“事情”的表现是手段,而不是分配的性能什么。短跑多多关照他们如何迅速下车块。马拉松运动员,没有这么多。

您也必须小心你如何基准。你应该比较例如针对malloc(size) new char[size]。如果测试malloc(size)new char[size]()那么它是因为后者套不公平的比较,内存为0,前者没有。比较反对calloc代替,还要注意malloccalloc从C ++中(不可能),他们证明可测量更快都可用。

不过说到底,如果作者“拥有”或开工项目,并喜欢用C来写,而不是C ++,那么他应该没有理由与可能,杂散性能声称的决定,他应该说证明它“我更喜欢C,这就是我使用的是什么”。通常,当有人提出有关语言表现这样的要求,和原来的测试是不正确的,你发现性能不为首选语言的真正原因。证明的说法是错误不会真正原因这个项目的作者突然开始喜欢C ++。

有在存储器分配方面C和C ++之间没有真正的区别。 C ++有更多的“隐藏”数据,如虚拟指针等,如果您选择对你的对象的虚方法。但分配字符数组是一样昂贵的C作为C ++中,事实上,他们很可能既使用malloc做到这一点。在性能方面,C ++调用为阵列中的每个对象的构造。请注意,这只是做,如果有一个默认的构造函数不执行任何操作,并优化了。

只要你预先分配数据池,以避免内存碎片,你要善于去。如果您有简单的POD结构不虚方法,没有构造,没有区别。

在C失宠唯一++是它的额外的复杂性 - 结合起来,与谁在使用不正确的程序员,你可以轻松地减慢显着。不使用C ++功能的C ++编译器会给你同样的性能。使用C ++正确,你有一些posisbilities要快。

<强>语言不是您的问题下,分配和遍历大的阵列是

在主致命的错误,你可以使分配(在任何语言)也将16G的内存,它初始化为零,只能用实际值后,以填补它。

在大多数性能提升我会从提高的局部性算法最优化的期望。

根据底层操作系统上,则可能也影响缓存算法 - 例如指示范围memroy的仅依次处理。

用于分配的原始数据,不应该有差C和C++在大多数系统,因为他们通常都使用相同的runtime library机制。我不知道如果这是典型的基准的缺陷,他们还测定的运行时间构造的电话在C++和方便地忘记了包括运行的任何种类的初始代码C。

此外,"更多可靠的(关于内存泄漏)"的说法不抱任何水如果你使用RAII在C++(作为你应该)。除非有人的参照使它泄漏更可靠地使用RAII、智能指针和容器类别将减少潜在渗漏,没有增加。

我的主要关切问题与分配,从存储器将是双重的:

  • 如果你越来越接近的物理存储器限制在机器运行的蒙特卡洛的模拟,这是一个很好的方式,以降低性能,因为磁盘很可能会开始鞭打当虚拟存储系统需要开始寻呼很多。虚拟存储器不是"免费",即使很多人认为它是。
  • 数据布局需要仔细考虑以最大限度地处理高速缓存的使用,否则你将部分地失去效益的保持数据的主存在第一位。

如果存储器分配是一个瓶颈中这样的代码,我建议而重新设计,在不改变语言更快分配。如果您分配内存一次,然后进行大量的计算,我希望这些计算是一个瓶颈。如果分配的成本显著,什么是错在这里。

可以使用的在C ++内存分配函数太C家族:两个标准mallocfreerealloc放大/ shring阵列和alloca到栈上分配存储器

如果您new去,它会比实际需要(主要是调试过程中)分配更多的内存和一致性做额外的检查。它也将调用构造函数的类。在一个释放(-O3)建立的差可以忽略不计于大多数应用。

现在什么new带来的是malloc不就是就地new。您可以预先分配一个缓冲区,然后用就地new把你的结构,该缓冲区,从而使“分配”,它是即时的。

所有的一切,我不会在C留下的,因为性能问题了。如果有什么事情,因为班通this指针寄存器,而不是参数像在C相当于你的代码的效率会更高。真正的原因,从C远离是C ++运行时的大小。如果开发嵌入式系统或引导加载程序的程序,你不能嵌入〜4MB运行。然而,对于普通应用,这不会有所作为。

如果你需要存储4-16 GB内存中的数据排列的计算过程中,你的机器只有物理内存2GB,然后呢?

如果你的机器具有的物理内存16GB?是否操作系统占用没有物理存储器?

是否操作系统甚至允许你4GB,16GB等?

的地址空间

我建议,如果性能是一个重要的实施约束,则理解如何平台,其意图被使用的,功能和执行均远远超过给定相同环境下C和C ++之间的任何可测量的性能差的问题更显著和算法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top