编程杂谈——std::vector与List<T>的性能比较
昨天在比较完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>的性能比较的更多相关文章
- C++ 并发编程,std::unique_lock与std::lock_guard区别示例
背景 平时看代码时,也会使用到std::lock_guard,但是std::unique_lock用的比较少.在看并发编程,这里总结一下.方便后续使用. std::unique_lock也可以提供自动 ...
- C++ folly库解读(二) small_vector —— 小数据集下的std::vector替代方案
介绍 使用场景 为什么不是std::array 其他用法 其他类似库 Benchmark 代码关注点 主要类 small_vector small_vector_base 数据结构 InlineSto ...
- c++转载系列 std::vector模板库用法介绍
来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...
- C++ 中的std::vector介绍(转)
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...
- std::vector介绍
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...
- std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义
std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义 这个容器保存了所有客户端连接的channel Channel2* Li ...
- std::vector数据复制
std::vector<boost::shared_ptr <ITEM> > srcItemList; // 数据源 std::vector<ITEM> des ...
- 单独删除std::vector <std::vector<string> > 的所有元素
下面为测试代码: 1.创建 std::vector< std::vector<string> > vc2; 2.初始化 std::vector<string> vc ...
- std::vector的分片拷贝和插入
一般我们在用Qt的QByteArrary或者List的时候,会有相应的append的方法,该函数,就是把数据加入末尾.但是std::vector就没有相应的方法.但是我们可以用insert方法来实现: ...
随机推荐
- Unity3D_02_基类MonoBehaviour/自带函数以及脚本执行的生命周期
导引: 其中Time,Input,Physics都是Unity中的全局变量.GameObject是游戏中的基本物件.GameObject是由Component组合而成的,GameObject本身必须有 ...
- .Net基础篇_学习笔记_第六天_for循环的嵌套_乘法口诀表
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Day 15 文件打包与压缩
1.什么是文件压缩? 将多个文件或目录合并成为一个特殊的文件.比如: 搬家...脑补画面 img. 2.为什么要对文件进行压缩? 当我们在传输大量的文件时,通常都会选择将该文件进行压缩,然后在进行传输 ...
- idea使用Deployment部署项目到阿里云服务器的全过程
一.前言 之前玩了一下 Alibaba Cloud Toolkit 一键部署插件 这里顺便再提一下idea原生的Deployment自动部署项目吧,该功能也很强大,也不需要离开idea就可以直接将项目 ...
- Hadoop 之 MapReduce原理
1.什么是MapReduce 答:简而言之,就是将一个大任务分成多个小的子任务(Map),并行执行后,合并结果(Reduce).下面举一个纸牌得栗子 2.MapReduce的运行流程 3.JobT ...
- 【linux】【docker】docker及docker-compose安装
安装 一. docker安装 Centos 安装docker18.03 wget https://download.docker.com/linux/centos/7/x86_64/stable/Pa ...
- node学习之路
现阶段开始学习使用node开发一个个人博客系统,nodejs 基于V8引擎,是一个让 JavaScript 运行在服务端的开发平台,功能强大 ,Node.js 可以作为服务器向用户提供服务,它跳过了 ...
- 解决微信小程序开发中wxss中不能用本地图片
微信小程序开发中wxss中不能用本地图片,我们可以用将我们的图片传到服务器上,然后直接引用在线地址.但是当我们没有服务器时,我们可以用"图床",这个具体可以百度.这里我们用第二种方 ...
- 【翻译】Docker Compose 与Docker Stack的不同
翻译原文 Docker引擎在1.12 版本集成了Docker Swarm, 带来了一些新工具. 现在可以无需安装 Docker Compose, 就可以利用docker-compose.yml 文件 ...
- JAVA设计模式---总述篇
一.设计模式(Design Pattern): 1.设计模式的概念 是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及 ...