- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编程中的常识是,由于缓存命中,内存局部性可以大大 boost 性能。我最近发现了 boost::flat_map
这是一个基于 vector 的 map 实现。它似乎不像您典型的那样受欢迎 map
/unordered_map
所以我找不到任何性能比较。它如何比较以及它的最佳用例是什么?
谢谢!
最佳答案
我最近在我的公司对不同的数据结构运行了一个基准测试,所以我觉得我需要放弃一个词。正确地对某些东西进行基准测试是非常复杂的。
基准测试
在网络上,我们很少找到(如果有的话)精心设计的基准测试。直到今天,我只找到了以记者的方式完成的基准测试(很快,并在地毯下扫描了数十个变量)。
1) 您需要考虑缓存预热
大多数运行基准测试的人都害怕计时器差异,因此他们运行他们的东西数千次并花费全部时间,他们只是小心翼翼地为每次操作采取相同的数千次,然后认为它具有可比性。
事实是,在现实世界中它没有什么意义,因为您的缓存不会是热的,并且您的操作可能只会被调用一次。因此,您需要使用 RDTSC 进行基准测试,并且只计算一次调用它们的时间。
英特尔发论文describing如何使用RDTSC(使用cpuid指令刷新管道,并在程序开始时至少调用3次以使其稳定)。
2) RDTSC 精度测量
我还建议这样做:
u64 g_correctionFactor; // number of clocks to offset after each measurement to remove the overhead of the measurer itself.
u64 g_accuracy;
static u64 const errormeasure = ~((u64)0);
#ifdef _MSC_VER
#pragma intrinsic(__rdtsc)
inline u64 GetRDTSC()
{
int a[4];
__cpuid(a, 0x80000000); // flush OOO instruction pipeline
return __rdtsc();
}
inline void WarmupRDTSC()
{
int a[4];
__cpuid(a, 0x80000000); // warmup cpuid.
__cpuid(a, 0x80000000);
__cpuid(a, 0x80000000);
// measure the measurer overhead with the measurer (crazy he..)
u64 minDiff = LLONG_MAX;
u64 maxDiff = 0; // this is going to help calculate our PRECISION ERROR MARGIN
for (int i = 0; i < 80; ++i)
{
u64 tick1 = GetRDTSC();
u64 tick2 = GetRDTSC();
minDiff = std::min(minDiff, tick2 - tick1); // make many takes, take the smallest that ever come.
maxDiff = std::max(maxDiff, tick2 - tick1);
}
g_correctionFactor = minDiff;
printf("Correction factor %llu clocks\n", g_correctionFactor);
g_accuracy = maxDiff - minDiff;
printf("Measurement Accuracy (in clocks) : %llu\n", g_accuracy);
}
#endif
这是一个差异测量器,它将取所有测量值中的最小值,以避免不时得到 -10**18(64 位第一个负值)。
map
与
vector
,因为它们的缓存位置很好,但
map
会分割内存),一些复杂度差的容器在很大程度上可以胜过低复杂度容器。然后在某个交叉点,它们将失败,因为包含的整体大小开始“泄漏”到主内存并导致缓存未命中,再加上可以开始感觉到渐近复杂性的事实。
memcpy
的事实中受益。 ,并且一些容器可以针对这些情况有特定的实现,使用部分模板特化,或者 SFINAE 根据 T 的特征选择算法。
unordered..
.
flat_unorderedmap
?这将类似于
google::sparse_map
或者类似的东西——一个开放的地址哈希映射。
rehash
的时候他们必须将周围的所有内容复制到新的扩展平面上,而标准的无序映射只需重新创建哈希索引,而分配的数据则保持原样。缺点当然是内存碎片化如 hell 。
0.8
;因此,您需要注意这一点,如果您可以在填充之前预先调整哈希映射的大小,请始终将其预先调整为:
intended_filling * (1/0.8) + epsilon
这将保证您在填充过程中永远不必虚假地重新散列和重新复制所有内容。
std::unordered..
)的优点是您不必关心这些参数。
boost::flat_map
是有序 vector ;因此,它将始终具有 log(N) 渐近复杂度,这不如开放地址哈希映射(摊销常数时间)好。你也应该考虑一下。
int
键和
__int64
/
somestruct
作为值)和
std::vector
.
typeid=__int64 . sizeof=8 . ispod=yes
typeid=struct MediumTypePod . sizeof=184 . ispod=yes
插入
std::map
进行 2 次测试和两者
flat_map
s 是
buggy 并实际测试
有序插入 (与其他容器的随机插入相比。是的,这很令人困惑,抱歉):
flat_map
(因此是最佳值的 160%)。
std::unordered_map
上测得 Windows 7 和 Windows 8 之间的性能差距超过 3000%用例(
discussed here )。
关于c++ - boost::flat_map 及其与 map 和 unordered_map 相比的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21166675/
这个问题在这里已经有了答案: 11年前关闭。 Possible Duplicate: Haskell: difference between . (dot) and $ (dollar sign) 好
我对 Java 平台没有任何了解,我想知道可以使用哪些工具(和方法)来帮助开发用 Java 编写的可维护代码。 我知道可以使用: 适用于任何环境的敏捷方法 用于单元测试代码的 jUnit/jMock(
我们的产品需要支持 IE9,但我们一直假设 IE9 支持 IE10+ CSS 规则。 是否有一种巧妙的方法来获取在 IE10+ 中有效但在 IE9 中不受支持的所有 CSS 规则,目的是在静态代码分析
我需要为 MyString 类重载运算符 + 和 +=。 MyString.h class MyString { char* m_pStr; }; 主要
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在升级现有的旧代码以使用 VS 2019*,在代码中我有以下函数在返回行失败: int foo(const char *fn) const { ofstream out(fn,ios::b
我想使用 R2D3 pacakge 在 R 中,但我不确定这个包与 D3.js 库的关系。 R2D3 是否以任何方式限制 D3 的功能?我们可以将 R 中的所有 D3 功能和特性与 R2D3 一起使用
我正在使用 WPF 语音识别库,试图在桌面应用程序中使用它来替代菜单命令。 (我想专注于没有键盘的平板电脑体验)。它可以工作 - 有点,除了识别的准确性太差以至于无法使用。所以我试着听写到 Word。
我在学校参加数据库类(class)。老师给了我们一个简单的练习:考虑以下简单的模式: Table Book: Column title (primary key) Column gen
我正在尝试学习 MVVM 模式,特别是当 View 表示数据库表时该怎么做,但 View 有几个元素表示单个数据库字段。举个简单的例子: 假设我有一个 DateTime 类型的数据库字段(每个数据库字
我有两张 table 。表单有约 77000 行。日志约有 270 万行。 以下查询将在不到一秒的时间内返回“30198”: SELECT COUNT(DISTINCT logs.DOCID) FRO
当您在 Eviews 中进行回归时,您会得到一组这样的统计数据: 在 R 中有没有一种方法可以在一个列表中获得所有/大部分关于 R 回归的统计数据? 最佳答案 请参阅summary,它将为大多数回归对
如果我枚举 type XType int const ( X1 XType = iota X2 ... Xn ) var XTypeNames = []string{"x1", "x2
我正在试用 ranger R包加速做了很多randomForest计算。我正在检查我从中得到的预测,并注意到一些有趣的事情,因为所做的预测完全不正确。 以下是比较 randomForest 的可重现示
我发现 Clang 编译速度比 GCC 慢了四倍。知道是什么原因造成的吗? ebg@tsuki(250)$ time /usr/bin/cc -DHC4 -DSAFETY -DNOREDUCE -DN
我注意到在尝试以 JSON 格式发布表单数据时,以下内容不起作用: $.ajax({ type: "POST", url: url, data: JSON.string
我的代码库中有很多 #if DEBUG/#endif 语句,它们大多具有断言类型逻辑,我不敢在生产环境中运行这些逻辑。 [Conditional("DEBUG")] public void Check
所以我正在开发一个平方根计算器,但我不知道 while 循环是否比 do while 循环更适合。 double x, y = 1.0, newY, squareRoot; bool
我有两个列表,一个是所有语言,另一个是网站拥有的语言子集,我的想法是返回所有语言,但如果子集的元素对应于所有语言的列表,则更改 bool 值的属性. 语言的DTO: public class DTOL
以下控制台应用程序运行正常 - 我很惊讶它没有出错。 class DelegateExperiments { //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
我是一名优秀的程序员,十分优秀!