keybord_dancer 2015-06-30 01:14 采纳率: 0%
浏览 1980

为什么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 <boost\algorithm\searching\knuth_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 set\n");
        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 search\n");

        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 << "times\n";
        QueryPerformanceCounter(&t2);
        printf("Costing time: %.2f s\n", (t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart);
        system("pause");

        QueryPerformanceCounter(&t1);
        printf("Testing boyer_moore_horspool search\n");
        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 << "times\n";
        QueryPerformanceCounter(&t2);
        printf("Costing time: %.2f s\n", (t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart);
        system("pause");

        QueryPerformanceCounter(&t1);
        printf("Testing knuth_morris_pratt search\n");
        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 << "times\n";
        QueryPerformanceCounter(&t2);
        printf("Costing time: %.2f s\n", (t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart);
        system("pause");


        QueryPerformanceCounter(&t1);
        printf("Tesing std search\n");
        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 << "times\n";
        QueryPerformanceCounter(&t2);
        printf("Costing time: %.2f s\n", (t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart);
        system("pause");

        return 0;
}

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

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

是什么导致了这么大的差距?
  • 写回答

2条回答 默认 最新

  • oyljerry 2015-06-30 01:44
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 github训练的模型参数无法下载
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题