- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在解析大约 1MB 大小的文件,读取前 300KB 并搜索一些特定的签名。我的策略是,对于每个字节,查看该字节是否在映射/vector/我知道可能位于签名开头的任何字节中,如果是,则寻找完整的签名——对于这个例子,假设那些领先的字节为 x37、x50 和 x52。共处理90个文件(实际9个文件10次),以下代码执行时间为2.122秒:
byte * bp = &buffer[1];
const byte * endp = buffer + bytesRead - 30; // a little buffer for optimization - no signature is that long
//multimap >::iterator lb, ub;
map >::iterator findItr;
vector::iterator intItr;
while (++bp != endp)
{
if (*bp == 0x50 || *bp == 0x52 || *bp == 0x37) // Comparison line
{
findItr = mapSigs.find(*bp);
for (intItr = findItr->second.begin(); intItr != findItr->second.begin(); intItr++)
{
bool bMatch = true;
for (UINT i = 1; i < intItr->mSignature.size(); ++i)
{
if (intItr->mSignature[i] != bp[i])
{
bMatch = false;
phá vỡ;
}
}
if (bMatch)
{
CloseHandle(fileHandle);
trả về giá trị đúng;
}
}
}
}
但是,我的初始实现仅用了 84 秒就完成了。唯一的区别与上面标有“//比较线”的行有关:
findItr = mapSigs.find(*bp);
if (findItr != mapSigs.end())
...
使用包含 3 个值的 vector 的非常相似的实现也会导致处理速度极慢(190 秒):
if (find(vecFirstChars.begin(), vecFirstChars.end(), *bp) != vecFirstChars.end())
{
findItr = mapSigs.find(*bp);
...
但是直接访问 vector 元素的实现执行得相当好(8.1 秒)。不如静态比较好,但仍然比其他选项好得多:
if (vecFirstChars[0] == *bp || vecFirstChars[1] == *bp || vecFirstChars[2] == *bp)
{
findItr = mapSigs.find(*bp);
...
目前最快的实现(受下面的组件 10 启发)如下,耗时约 2.0 秒:
bool validSigs[256] = {0};
validSigs[0x37] = true;
validSigs[0x50] = true;
validSigs[0x52] = true;
while (++bp != endp)
{
if (validSigs[*bp])
{
...
将其扩展为使用 2 个 validSigs 来查看第二个字符是否有效,并将总运行时间减少到 0.4 秒。
我觉得其他实现应该表现得更好。特别是 map ,它应该随着更多签名前缀的添加而扩展,并且搜索是 O(log(n)) vs O(n)。我错过了什么?我唯一的猜测是,通过静态比较和(现存较少的) vector 索引,我得到了用于比较的值缓存在寄存器或其他位置,这使得它比读取快得多从内存里。如果这是真的,我是否能够明确地告诉编译器将经常使用特定值?对于下面的代码,是否还有其他不明显的优化可供我利用?
我正在使用 Visual Studio 2008 进行编译。
câu trả lời hay nhất
这很简单,可以归结为执行的指令数。 vector 、映射或查找表将完全驻留在 CPU 一级数据缓存中,因此内存访问不会占用时间。至于查找表,只要大多数字节与签名前缀不匹配,分支预测器就会停止流量控制占用时间。 (但其他结构确实会产生流量控制开销。)
非常简单,依次与 vector 中的每个值进行比较需要 3 次比较。 map 是 O(log N),但由于导航链接数据结构,系数(被大 O 符号忽略)很大。查找表的复杂度为 O(1),系数很小,因为访问该结构可以通过一条机器指令完成,然后剩下的就是与零进行一次比较。
分析性能的最佳方法是使用分析器工具,例如 valgrind/kcachegrind。
关于c++ - 为什么 vector 和 map 搜索比静态比较慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13280397/
我正在尝试从一个 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 m
我是 Haskell 的新手,我认为函数 map map和 map.map在 Haskell 中是一样的。 我的终端给了我两种不同的类型, (map.map) :: (a -> b) -> [[a]
我的目标是创建一个 map 的 map ,这样我就可以通过它的键检索外部 map 的信息,然后通过它们的键访问它的“内部” map 。 但是,当我得到每个内部映射时,我最初创建的映射变成了一个对象,我
如何使用 Java8 编写以下代码? for (Entry> entry : data.entrySet()) { Map value = entry.getValue(); if (valu
我有覆盖整个南非的图片。它们为Tiff格式,并已将坐标嵌入其中。我正在尝试拍摄这些图像(大约20张图像),并将它们用作我的iPhone应用程序中的地图叠加层。我的问题在于(准确地)将地图切成图块。 我
所以我有 2 std::map s >一个是“旧的”,一个是“新的”,我想知道哪些文件被删除了,这样就能够遍历差异并对 shared_ptr 做一些事情。这样的事情可能吗?如何做到? 最佳答案 虽然
是否可以将当前查看的 google.maps.Map 转换为静态图像链接,以便我可以获取图像并将其嵌入到 PDF 中? 我在 map 上添加了一些带有自定义图标的标记,所以我不确定这是否真的可行。 如
你能帮我吗 Java Streams ? 从标题可以看出我需要合并List>>进入Map> . 列表表示为List>>看起来像: [ { "USER_1":{
对于 idAndTags 的第二个条目,内部映射被打乱,但第一个条目则不然 第一次接近! for (Map.Entry> entryOne : idAndTags.entrySet()) {
我将从我的代码开始,因为它应该更容易理解我想要做什么: @function get-color($color, $lightness) { @return map-get(map-get($col
我过去曾在许多网站上使用过 Google map ,但遇到了以前从未遇到过的问题。 map 窗口正在显示,但它只显示左上角的 map 片段,以及之后的任何内容(即使我在周围导航时),右侧也不会加载任何
众所周知,这些 map ,无论是常规街道 map 还是卫星 map ,在中国的特定地区都无法正确排列。那么哪个 map 排列正确,是卫星 map 还是默认街道 map ?一些网站表明卫星 map 是正
在拖尾事件之后,我面临着获取此处 map 中的 map 边界的问题。我需要新的经纬度来在新更改的视口(viewport)中获取一些项目/点。我只是想在拖动结束时获得谷歌地图map.getBounds(
我想做的是通过 ajax API 显示以英国邮政编码为中心的小型 bing 生成 map 。我相信这是可能的;我在 Bing map 文档中找不到如何将英国邮政编码转换为可以插入 map Ajax 控
我有一个 List我想转换成的 e Map>其中外部字符串应为“Name”,内部字符串应为“Domain”。 Name Id Domain e(0) - Emp1, 1, Insuran
我的第 2 部分:https://stackoverflow.com/questions/21780627/c-map-of-maps-typedef-doubts-queries 然后我继续创建 I
是否可以在 1 行中使用 Java8 编写以下所有 null 和空字符串检查? Map> data = new HashMap<>(holdings.rowMap()); Set>> entrySet
我正在审查一个项目的旧代码,并使用 Map 的 Map 的 Map 获得了如下数据结构(3 层 map ): // data structure Map>>> tagTree
这可能是一种不好的做法,但我还没有找到更好的解决方案来解决我的问题。所以我有这张 map // Map>> private Map>> properties; 我想初始化它,这样我就不会得到 Null
我们在 JDK 1.7 中使用 HashMap,我在使用 SonarQube 进行代码审查时遇到了一些问题。 请考虑以下示例: public class SerializationTest imple
Tôi là một lập trình viên xuất sắc, rất giỏi!