欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

编程杂谈——std::vector与List的性能比较

程序员文章站 2023-10-16 19:06:39
昨天在比较完C++中std::vector的两个方法的性能差异并留下记录后—— "编程杂谈——使用emplace_back取代push_back" ,今日尝试在C 中测试对应功能的性能。 C 中对应std::vector的数据结构为List。更多的对应关系可以参照下面: std::vector Li ......

昨天在比较完c++中std::vector的两个方法的性能差异并留下记录后——,今日尝试在c#中测试对应功能的性能。

c#中对应std::vector的数据结构为list。更多的对应关系可以参照下面:

std::vector - list
std::list - linkedlist
std::map - dictionary<k, v>
std::set - hashset
std::multimap - dictionary<k, list>

c#的测试代码如下:

using system;
using system.collections.generic;
using system.diagnostics;

namespace consoleapp
{
    class item
    {
        public string name { get; set; }
    }
    class program
    {
        static void main(string[] args)
        {
            var sw = new stopwatch();
            sw.start();
            var count = 100000;
            var l = new list<item>();
            
            for (int i = 0; i < count; i++)
            {
                l.add(new item { name = "test" });
            }

            console.writeline(sw.elapsedmilliseconds / 1000.0);
        }
    }
}

程序执行结果约为0.077(该值每次会发生少许变化)

而c++的测试代码的结果约是0.207。这就有违于我们一般的认知了,毕竟通常都觉得c++的性能要优于c#。

#include <iostream>
#include <vector>
#include <chrono>

class item
{
public:
    item(std::string name):name(name){}
private:
    std::string name;
};

int main()
{
    std::vector<item> v;
    int count = 100000;
    v.reserve(count);
    clock_t begin_time = clock();
    for (auto i = 0; i < count; i++)
    {
        v.emplace_back("test");
    }

    std::cout << float(clock() - begin_time) / clocks_per_sec << std::endl;
}

原来这里犯了个错误,如果要进行基准测试的话,必须要在release模式下进行。

当改成release模式后,c++的代码执行时间变成了0.003,而c#也下降到了0.061左右。

不过在上述c#代码中,缺少一点优化,var l = new list<item>();没有预设容量值,如果改成var l = new list<item>(count);,执行时间进一步下降至0.050左右。

然而c#代码还可以继续优化,将item类改成结构体后,结果变成了0.006。

struct item
{
    public string name { get; set; }
}

如果把c++代码中也同样改成结构体,则几乎没有获得什么优化。

struct item
{
public:
    item(std::string name):name(name){}
private:
    std::string name;
};

最后将测试数据量从10w加至1000w后,c++代码的执行时间约是0.286,而c#的约为0.627。同样是2倍左右的差距。

值得注意的是,上述的c#代码是在.net core 3.0基础上测试,如果改成.net framwork 4.8,执行时间会降为0.536左右。由此可见,.net core应该还留有不少可以优化的地方,希望其在性能方面上能够进一步改善。