我计划参与一个用C语言编写的代码的开发,用于蒙特卡洛分析复杂问题。这段代码在内存中分配了大量的数据数组来加速它的性能,因此代码的作者选择了C而不是C++,声称用C可以使代码更快、更可靠(关于内存泄漏)。
你同意这一点吗?如果您在计算过程中需要在内存中存储4-16 GB的数据数组,您会选择什么?
发布于 2010-03-25 15:41:48
当然是C++。默认情况下,两者之间没有显著差异,但C++提供了一些C语言没有的东西:
底线是,在这方面,C绝对没有提供比C++更好的可能性。在最坏的情况下,你可以用同样的方式做完全相同的事情。
发布于 2010-03-25 18:44:05
C99有一个C++所没有的特性,它可以在大量数字处理代码中显著提高速度,这就是关键字restrict。如果您可以使用支持它的C++编译器,那么在进行优化时,工具包中就有了一个额外的工具。不过,这只是一个潜在的好处:充分的内联可以实现与restrict相同的优化,甚至更多。它也与内存分配无关。
如果代码的作者可以演示C和C++代码分配4-16 to数组的性能差异,那么(a)我很惊讶,但好吧,这是有区别的,(b)程序将分配多少次这么大的数组?你的程序实际上是要花费大量的时间来分配内存,还是把大部分时间花在访问内存和进行计算上?与分配时间相比,使用4 4GB阵列实际执行任何操作都需要很长时间,这意味着您应该担心“任何”的性能,而不是分配的性能。短跑运动员非常关心他们离开积木的速度。马拉松跑步者,就没那么多了。
您还必须小心如何进行基准测试。例如,您应该将malloc(size)与new char[size]进行比较。如果你在new char[size]()上测试malloc(size),那么这是一个不公平的比较,因为后者将内存设置为0,而前者不是。请改为与calloc进行比较,但还要注意,malloc和calloc都可以从C++获得,因为它们确实证明它们的速度要快得多。
但是,最终,如果作者“拥有”或启动了这个项目,并且更喜欢用C而不是C++编写,那么他不应该用可能是虚假的性能声明来证明这个决定,他应该说“我更喜欢C,这就是我正在使用的”。通常,当有人对语言性能做出这样的声明,而测试结果不是真的时,你会发现性能并不是语言偏好的真正原因。证明声明是假的实际上不会导致这个项目的作者突然开始喜欢C++。
发布于 2010-03-25 15:41:06
就内存分配而言,C和C++之间没有真正的区别。如果你选择在你的对象上使用虚拟方法,C++会有更多的“隐藏”数据,比如虚拟指针等等。但是在C中分配一个字符数组和在C++中一样昂贵,事实上,它们可能都是使用malloc来实现的。就性能而言,C++为数组中的每个对象调用一个构造函数。请注意,只有当有一个默认构造函数时才会这样做,默认构造函数什么也不做,并且会被优化。
只要您预先分配了数据池,为了避免内存碎片,您就应该准备好了。如果你有简单的POD-structs,没有虚方法,也没有构造函数,那就没有区别了。
https://stackoverflow.com/questions/2513741
复制相似问题