C ++映射查找性能与PHP数组查找性能

时间:2011-11-09 11:18:26

标签: php c++ arrays performance map

我无法理解以下内容,我希望有人可以为我阐明一下:

在C ++中,如果我创建一个包含2M个不同文本位(testdata)的测试数据向量,然后使用这些字符串作为索引值创建一个映射,然后查找所有值,如下所示:

 //Create test data
for(int f=0; f<loopvalue; f++)
{   
    stringstream convertToString;
    convertToString << f;
    string strf = convertToString.str();
    testdata[f] = "test" + strf;
}

    time_t startTimeSeconds = time(NULL);

   for(int f=0; f<2000000; f++) testmap[ testdata[f] ] = f; //Write to map
   for(int f=0; f<2000000; f++) result = testmap[ testdata[f] ]; //Lookup

   time_t endTimeSeconds = time(NULL);
   cout << "Time taken " << endTimeSeconds - startTimeSeconds << "seconds." << endl;

需要10秒钟。

如果我在PHP中看起来至少相同:

<?php
$starttime = time();
$loopvalue = 2000000;

//fill array
for($f=0; $f<$loopvalue; $f++)
{
    $filler = "test" . $f;
    $testarray[$filler] = $f;
}

//look up array
for($f=0; $f<$loopvalue; $f++)
{
    $filler = "test" . $f;
    $result = $testarray[$filler];
}

$endtime = time();
echo "Time taken ".($endtime-$starttime)." seconds.";
?>

......只需3秒钟。

鉴于PHP是用C语言编写的,有没有人知道PHP如何实现这么快的文本索引查找?

由于 ç

3 个答案:

答案 0 :(得分:5)

你的循环不是绝对等同的算法。 请注意,在C ++版本中,您有

  1. testmap [testdata [f]] - 这实际上是一个查找+插入
  2. testmap [testdata [f]] - 2次查找
  3. 在PHP版本中,您只需在第一个循环中插入并在第二个循环中查找。

    PHP被解释 - 通常如果您的代码在PHP中更快,请首先检查代码! ; - )

答案 1 :(得分:2)

我怀疑你对错误的东西进行基准测试。 无论如何,我使用了你的代码(必须对你的数据类型做一些假设),这是我的机器的结果:

PHP: 时间需要2秒。

C ++(使用std :: map): 时间需要3秒。

C ++(使用std :: tr1 :: unordered_map): 时间需要1秒。

使用

编译的C ++
g++ -03

这是我的测试C ++代码:

#include <map>
#include <sstream>
#include <string>
#include <vector>
#include <iostream>
#include <tr1/unordered_map>


int main(){
    const int loopvalue=2000000;
    std::vector<std::string> testdata(loopvalue);
    std::tr1::unordered_map<std::string, int> testmap;
    std::string result;
    for(int f=0; f<loopvalue; f++)
    {   
        std::stringstream convertToString;
        convertToString << f;
        std::string strf = convertToString.str();
        testdata[f] = "test" + strf;
    }

    time_t startTimeSeconds = time(NULL);

    for(int f=0; f<loopvalue; f++) testmap[ testdata[f] ] = f; //Write to map
    for(int f=0; f<loopvalue; f++) result = testmap[ testdata[f] ]; //Lookup

    time_t endTimeSeconds = time(NULL);
    std::cout << "Time taken " << endTimeSeconds - startTimeSeconds << "seconds." << std::endl;
}

结论:

您测试了未经优化的C ++代码,甚至可能使用VC ++编译,在调试模式下编译时,默认情况下在std :: vector :: operator []中有一个边界检查。

当我们使用std :: map时,由于查找复杂性的差异(请参阅n0rd的答案),PHP与优化的C ++代码仍有差异,但使用Hashmap时C ++会更快。

答案 2 :(得分:0)

根据another question,PHP中的关联数组实现为hash tables,其搜索复杂度平均为O(1),而C ++中的std::map是带搜索的二叉树O(log n)的复杂性,这是较慢的。