boost-为什么Boost库的搜索函数明显比std的search慢?

问题描述

为什么Boost库的搜索函数明显比std的search慢?

在学习boost的时候测试了一下boost的algorithm中的三个search函数,分别是Boyer-Moore Search,Boyer-Moore-Horspool Search,Knuth-Morris-Pratt Search,同时也测试了std的search函数,测试的结果有点意外,std的search花的时间比前面三个快了两个数量级,问题出在哪儿?测试的代码如下:

#define _CRT_SECURE_NO_WARNINGS

#include <boost/algorithm/searching/boyer_moore.hpp>
#include <boost/algorithm/searching/boyer_moore_horspool.hpp>
#include <boostalgorithmsearchingknuth_morris_pratt.hpp>
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <Windows.h>
#include <time.h>
using namespace std;
using namespace boost::algorithm;

void printMessage(char* msg, int startX, int startY)
{
        HANDLE hd;
        COORD pos;
        pos.X = startX;
        pos.Y = startY;
        hd = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleCursorPosition(hd, pos);
        printf("%s", msg);
}

int main(int argc, char ** argv)
{
        printf("Generating test setn");
        vector<int> vec;
        srand(unsigned int(time(NULL)));
        for (int i = 0; i < 10000; i++)
        {
                vec.push_back(rand() % 15000);
                char msg[50];
                sprintf(msg,"%.2f%%n", i*1.0/99.99);

                printMessage(msg, 0, 1);
        }

        LARGE_INTEGER t1, t2, tc;
        QueryPerformanceFrequency(&tc);
        QueryPerformanceCounter(&t1);

        printf("Testing boyer moore searchn");

        int count = 0;
        for (int i = 0; i < 1000; i++)
        {
                vector<int> key;
                key.push_back(rand() % 15000);
                if (boyer_moore_search(vec.begin(), vec.end(), key.begin(), key.end()) != vec.end())
                {
                        count++;
                }
                char msg[50];
                sprintf(msg,"%.2f%%n", i / 9.99);
                printMessage(msg, 0, 3);
        }
        cout << "Hit " << count << "timesn";
        QueryPerformanceCounter(&t2);
        printf("Costing time: %.2f sn", (t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart);
        system("pause");

        QueryPerformanceCounter(&t1);
        printf("Testing boyer_moore_horspool searchn");
        count = 0;
        for (int i = 0; i < 1000; i++)
        {
                vector<int> key;
                key.push_back(rand() % 15000);
                if (boyer_moore_horspool_search(vec.begin(), vec.end(), key.begin(), key.end()) != vec.end())
                {
                        count++;
                }
                char msg[50];
                sprintf(msg, "%.2f%%n", i / 9.99);
                printMessage(msg, 0, 8);
        }
        cout << "Hit " << count << "timesn";
        QueryPerformanceCounter(&t2);
        printf("Costing time: %.2f sn", (t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart);
        system("pause");

        QueryPerformanceCounter(&t1);
        printf("Testing knuth_morris_pratt searchn");
        count = 0;
        for (int i = 0; i < 1000; i++)
        {
                vector<int> key;
                key.push_back(rand() % 15000);
                if (knuth_morris_pratt_search(vec.begin(), vec.end(), key.begin(), key.end()) != vec.end())
                {
                        count++;
                }
                char msg[50];
                sprintf(msg, "%.2f%%n", i/ 9.99);
                printMessage(msg, 0, 13);
        }
        cout << "Hit " << count << "timesn";
        QueryPerformanceCounter(&t2);
        printf("Costing time: %.2f sn", (t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart);
        system("pause");

        QueryPerformanceCounter(&t1);
        printf("Tesing std searchn");
        count = 0;
        for (int i = 0; i < 1000; i++)
        {
                vector<int> key;
                key.push_back(rand() % 15000);
                if (search(vec.begin(), vec.end(), key.begin(), key.end()) != vec.end())
                {
                        count++;
                }
                char msg[50];
                sprintf(msg, "%.2f%%n", i/ 9.99);
                printMessage(msg, 0, 18);
        }
        cout << "Hit " << count << "timesn";
        QueryPerformanceCounter(&t2);
        printf("Costing time: %.2f sn", (t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart);
        system("pause");

        return 0;
}

测试环境是vs2013,测试结果如下图:

![测试截图](http://img.ask.csdn.net/upload/201506/30/1435626813_549413.png)

是什么导致了这么大的差距?

解决方案

我这不善于表达,说起来太罗嗦。其实就是算法的问题。std中的search是线性的。这样吧。给你贴几个对比的网址你可以看一下,他们的表述都非常好。
关于Boyer-Moore算法的:http://blog.csdn.net/ijuliet/article/details/4200771
关于Knuth Morris Pratt (KMP)算法的:http://blog.csdn.net/todleigh/article/details/2955906
关于std::search与KMP算法的对比:http://www.docin.com/p-198453416.html
希望可以帮到你,我也是初学者,不过对于算法比较感兴趣一些。

解决方案二:

是否编译器都开了优化。这样才好比较

时间: 2024-10-29 21:07:51

boost-为什么Boost库的搜索函数明显比std的search慢?的相关文章

boost python c++接口-boost python 封装c++接口 回调函数设置类对象

问题描述 boost python 封装c++接口 回调函数设置类对象 在python调用的时候报错,应该是self不是c++的类型导致无法使用 解决方案 最好是再封装一层C的接口给Python调用

【Boost】boost库asio详解3——io_service作为work pool

无论如何使用,都能感觉到使用boost.asio实现服务器,不仅是一件非常轻松的事,而且代码很漂亮,逻辑也相当清晰,这点上很不同于ACE.使用io_service作为处理工作的work pool,可以看到,就是通过io_service.post投递一个Handler到io_service的队列,Handler在这个io_service.run内部得到执行,有可能你会发现,io_services.dispatch的接口也和io_service.post一样,但不同的是它是直接调用而不是经过push

PHP教程:GD库的imagecolorset函数简单修改图片颜色

现在有一张背景色为纯蓝色(或者红色等) 并且与照片里人物有很明显的反差色彩 的一寸单人照照片,现想把,该图片中的蓝色背景用PHP处理为白色.即类似于PS中,用白色填充蓝色的效果. 使用GD库的imagecolorset函数可以修改简单的索引色. 不过只能对gif与png图片有效 <?php$img = file_get_contents('http://图片地址);$im = imagecreatefromstring($img);$bg = imagecolorat($im, 0, 0);im

C#调用非托管动态库中的函数

C#如何调用一个非托管动态库中的函数呢,比如用VC6写的动态库,总之C#调用动态库的过程是比Java调用DLL动态库方便快捷多了,下面举例说明这个过程. 1.创建一个非托管动态库 代码如下: //这一句是声明动态库输出一个可供外不调用的函数原型. extern "C" __declspec(dllexport) int add( int , int ); int add( int a, int b) { //实现这个函数returna+b; } 注意上面代码,一定要加上 extern&

Lua 数学库的所有函数功能作用一览

  这篇文章主要介绍了Lua 数学库的所有函数功能作用一览,本文罗列了lua数学库的所有函数,并对每个函数的功能作用做了简短描述,需要的朋友可以参考下 math.pi 为圆周率常量 = 3.14159265358979323846 abs 取绝对值 math.abs(-15) 15 acos 反余弦函数 math.acos(0.5) 1.04719755 asin 反正弦函数 math.asin(0.5) 0.52359877 atan2 x / y的反正切值 math.atan2(90.0,

Excel快速查找和搜索函数动画教程

<Excel2003入门动画教程53.Excel快速查找和搜索函数>. 演示动画 操作步骤 在用函数处理数据时,常常不知道该使用什么函数比较合适.Excel的"搜索函数"功能可以帮你缩小范围,挑选出合适的函数. 执行"插入→函数"命令,打开"插入函数"对话框,在"搜索函数"下面的方框中输入要求(如"计数"),然后单击"转到"按钮,系统即刻将与"计数"有关的

IDA反汇编/反编译静态分析iOS模拟器程序(三)函数表示与搜索函数

打开IDA一般都是去搜索函数,可以说函数是IDA工程的基本单位吧,数据结构什么的都是为函数服务而已.函数列表在界面左侧的Functions Window: 可以看到,UIKit有27789个函数呢.在搜索前要先知道函数的表示方式. Objective-C函数的表示: 拿UIView来做例子吧.在xcode documentation中,UIView的函数会有这样的表示: + (void)beginAnimations:(NSString *)animationID context:(void *

c++-为什么我在用snmp++库的get_bulk函数获取表格中数据时时只会得到一个结果

问题描述 为什么我在用snmp++库的get_bulk函数获取表格中数据时时只会得到一个结果 我正在用SNMP++库中的get_bulk函数获取MIB为1.3.6.1.2.1.4.21.1.1的值,理论上应该得到的值为:1.3.6.1.2.1.4.21.1.1.0.0.0.0 : 0.0.0.01.3.6.1.2.1.4.21.1.1.127.0.0.0 : 127.0.0.01.3.6.1.2.1.4.21.1.1.127.0.0.1 : 127.0.0.1....但是实际我却只得到了1.3.

c++动态连接库中的函数返回值为指针,请问在主程序中如何调用这个库的函数。

问题描述 c++动态连接库中的函数返回值为指针,请问在主程序中如何调用这个库的函数. [code=c]extern "C" int __declspec(dllexport)add(int x, int y); extern "C" int __declspec(dllexport)*add1(); int add(int x, int y) { return x + y; } int *add1() { static int a[3]={1,2,3}; stati