昨天在比较完C++中std::vector的两个方法的性能差异并留下记录后——编程杂谈——使用emplace_back取代push_back,今日尝试在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应该还留有不少可以优化的地方,希望其在性能方面上能够进一步改善。

编程杂谈——std::vector与List<T>的性能比较的更多相关文章

  1. C++ 并发编程,std::unique_lock与std::lock_guard区别示例

    背景 平时看代码时,也会使用到std::lock_guard,但是std::unique_lock用的比较少.在看并发编程,这里总结一下.方便后续使用. std::unique_lock也可以提供自动 ...

  2. C++ folly库解读(二) small_vector —— 小数据集下的std::vector替代方案

    介绍 使用场景 为什么不是std::array 其他用法 其他类似库 Benchmark 代码关注点 主要类 small_vector small_vector_base 数据结构 InlineSto ...

  3. c++转载系列 std::vector模板库用法介绍

    来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...

  4. C++ 中的std::vector介绍(转)

    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...

  5. std::vector介绍

    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...

  6. std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义

    std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义 这个容器保存了所有客户端连接的channel Channel2* Li ...

  7. std::vector数据复制

    std::vector<boost::shared_ptr <ITEM> > srcItemList;  // 数据源 std::vector<ITEM>  des ...

  8. 单独删除std::vector <std::vector<string> > 的所有元素

    下面为测试代码: 1.创建 std::vector< std::vector<string> > vc2; 2.初始化 std::vector<string> vc ...

  9. std::vector的分片拷贝和插入

    一般我们在用Qt的QByteArrary或者List的时候,会有相应的append的方法,该函数,就是把数据加入末尾.但是std::vector就没有相应的方法.但是我们可以用insert方法来实现: ...

随机推荐

  1. Visual Studio 调试 —— 附加到进程(远程服务器)

    一般在部署环境下不会有 Visual Studio 开发工具的,所以需要有 Remote Debugger(远程调试器) 才可以进行远程调试. Remote Debugger 获取 方法一:Visua ...

  2. 055 Python第三方库安装

    目录 一.概述 二.看见更大的Python世界 2.1 Python社区 2.1.1 PyPI 2.1.2 实例:开发与区块链相关的程序 2.2 安装Python第三方库 三.第三方库的pip安装方法 ...

  3. Java 13 明天发布,最新最全新特性解读

    2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,新的发布周期严格遵循时间点,将在每年的3月份和9月份发布. 目前,JDK官网上已经可以看到JDK 13的进展,最新版的JDK ...

  4. 纯css实现乌云密布的天气图标

    效果 效果如下 ​ 实现思路 使用box-shadow属性画几个灰色的圆,将这些圆错落的组合在一起,形成乌云图案 after伪元素写乌云下的投影 增加动画 dom结构 用两个嵌套的div容器,父容器来 ...

  5. innobackupex备份参数slave-info、safe-slave-backup

    mysql物理备份用的比较多的是innobackupex命令,备份常用,但对于里面的两个参数slave-info.safe-slave-backup一直搞的不太明白,今儿亲测了一下. 先解释一下参数意 ...

  6. Winform中使用zxing和Graphics实现自定义绘制二维码布局

    场景 zxing.dll下载 https://download.csdn.net/download/badao_liumang_qizhi/11623214 效果 实现 根据上面文章中将简单的二维码生 ...

  7. java需要了解和学习的技能

    一:系统架构师是一个最终确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节.扫清主要难点的技术人员.主要着眼于系统的“技术实现”.因此他/她应该是特定的开发平台.语言.工具的大师 ...

  8. Node.js之模块机制

    > 文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. ![file](https://img2018.cnblogs.com/blog/830272/20 ...

  9. 最基础的Nginx教学

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. Nginx同Apache一样都是一种WEB服务器.基于REST架构风格,以统一资源描述符URI或者统一资源定位 ...

  10. Android嵌入式开发初学者的几个注意点

    一:首先你必须了解ARM平台 Android 移植与驱动核心开发,当然也可以是X86和其他的平台,不过其他平台的Android智能终端开发并不是很多. Android嵌入式智能操作系统是基于Linux ...