|
|
1
17
Visual Studio 2010的测量结果表明
STD::比特集通过一个对象将它的全部内容存储在对象中
数组,这使得大的位集不适合放在堆栈上——这本身不是一个性能参数。
好。我想通常的计时注意事项适用于YMMV,但如果有人想亲自尝试,我使用的测试代码如下: 我的盒子上的输出是:
位图.cpp
位图.h
循环.cpp
编译器命令行:
注意/o2和 丢失的 /GL(无整个PRG选项)。 |
|
|
2
6
既然我是你提出这个问题的依据, here's where I got that idea from :
_它将bools打包,并将其作为单个位(例如chars)存储在其内部表示中。这样做的一个后果是,它不能只从其运算符[]或其未引用的迭代器[2]返回正常的bool&值;相反,它必须使用类似bool但绝对不是bool的助手“proxy”类进行游戏。不幸的是,这也意味着
艾斯
底线:如果你更关心速度而不是尺寸,你不应该使用
或者,正如我建议的那样,如果你知道你的套装能达到的最大尺寸,使用
|
|
|
3
2
老实说,我认为bitset最好在堆栈中使用,而不是在堆中使用。 此外,这两种方法并没有相互冲突,因为优雅的解决方案可以是这样的:
将这两个测试进行比较可能很有趣:
此外,为了增加这里的答案并提醒编译器在性能上也有很大的依赖性,下面是一个简单的测试:
(但所有这些测试都有点棘手,可能只给我们提供了直接比较的大致概念。分析项目,这是最后唯一要做的事情。)
注: 尺寸10^7:
我也包括了对象的构造函数和析构函数的开销时间。 这里是简单的测试代码:
VS2012输出:
mingw/g++输出-o2:
MIW/G+输出-O2-STD= C++ 11:
G++4.8.2输出-O2:
G++4.82输出-O2-STD= C++ 11:
结论: 对于这些用例,作为一个粗略的概念向量似乎更快。 我不运行多个距离并平均结果,但或多或少的值总是相同的。 关于vs的注释 :我认为它使用了与gcc不同的内存管理机制,对于这些用例,在生成的代码中似乎较慢。 |
|
4
1
矢量使用迭代器访问其元素,迭代器不能是bool*的简单typedef,这使得它比不提供迭代器的位集慢。另一个使其快速的原因是它的大小是已知的编译时间,因此它不使用new进行分配,这比堆栈分配慢。只是随便的想法 |
|
|
5
1
这是我访问/插入30亿元素的不科学基准
使用优化(编译器标志:
无优化(编译器标志:
因此,在这些条件下,当代码被优化时,位集比向量快,而向量实际上在不优化时以(非常小的)边缘排在最前面。 也就是说,如果您的代码是时间关键的,那么您可能应该自己执行基准测试,因为我怀疑这些数字是高度特定于编译器/环境的。 基准代码:
|
|
|
6
-2
另外,请注意
|
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |