Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >为什么向量范围构造器比填充构造函数快10倍?

为什么向量范围构造器比填充构造函数快10倍?
EN

Stack Overflow用户
提问于 2021-04-08 17:58:47
回答 1查看 180关注 0票数 0

我测试了以下两种用100'000元素填充向量的方法:

代码语言:javascript
代码运行次数:0
复制
#include <iostream>
#include <vector>
#include <chrono>

using std::cout;
using std::endl;
using std::vector;
using std::chrono::high_resolution_clock;
using std::chrono::duration_cast;

int main()
{
    const int n = 100'000;

    cout << "Range constructor: " << endl;
    high_resolution_clock::time_point t0 = high_resolution_clock::now();

    int nums10[n];
    for (int i = 0; i < n; ++i) {
        nums10[i] = i;
    }
    vector<int> nums11(nums10, nums10 + n);

    high_resolution_clock::time_point t1 = high_resolution_clock::now();
    cout << "Duration: " << duration_cast<std::chrono::microseconds>(t1 - t0).count() << endl;


    cout << "Fill constructor: " << endl;
    t0 = high_resolution_clock::now();
    
    vector<int> nums1(n);
    for (int i = 0; i < n; ++i) {
        nums1[i] = i;
    }

    t1 = high_resolution_clock::now();
    cout << "Duration: " << duration_cast<std::chrono::microseconds>(t1 - t0).count() << endl;;
}

在我的例子中,范围构造函数运行速度快了近10倍(600微秒对5000微秒)。

为什么这里会有任何性能差异呢?据我所知,有同样数量的外派业务。使用范围构造函数,向数组分配100‘000个元素,然后将所有元素复制到向量中。

这不应该与填充构造函数相同吗?在该构造函数中,首先将100‘000个元素初始化为0,然后在for循环中为所有元素分配“真实”值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-08 18:45:24

gcc -O0

在第一次测试中:

  • 用来填充数组的循环(程序集的第49-57行)被编译为一个简单的循环,在每次迭代中都有一个存储到内存的存储。它没有得到很好的优化(索引变量保留在堆栈中,而不是在寄存器中,并且重复地来回移动),但至少它是内联代码,不进行任何函数调用。
  • 范围构造函数是对库中预编译构造函数的单个调用(第69行)。我们可以假设库函数是通过积极的优化来编译的;它可能会在手写程序集中调用高度优化的memcpy。所以它大概是最快的。

在第二次测试中:

  • 填充构造函数是一个库调用(第113行)。同样,这大概是尽可能快的速度(可能称为手工优化的memset)。
  • 填充向量的循环(第118-130行)在每次迭代的std::vector<int>::operator[]上生成对的函数调用(第126行)。尽管operator[]本身可能是相当快的,已经预编译了,但每次函数调用的开销,包括重新加载带有参数的寄存器的代码,都是一个杀手。如果您正在使用优化进行编译,那么这个调用可以内联;所有的开销都会消失,而且每次迭代都会有一个内存存储。但你不是在优化,你猜怎么着?性能深为次优。

带优化第二次测试显然更快。这是有意义的,因为它只需要写两次相同的内存块,永远不读;而第一个内存块需要写一个内存块,然后再读取它来写第二个块。

寓意:未优化的代码可能真的很糟糕,如果不尝试这样的优化,那么两段可以优化成非常相似的代码可能会产生很大的不同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67014099

复制
相关文章
在Linux中对文件的编码及对文件进行编码转换操作
参考:https://www.cnblogs.com/mithrilon/archive/2018/06/03/9082449.html
别先生
2020/10/10
9.6K0
在Linux中对文件的编码及对文件进行编码转换操作
C# Base64上传文件
/// <summary> /// base64转换为图片并保存在指定目录中 /// </summary> /// <param name="strbase64">64Base码</param> /// <returns></returns> public static void Base64ToImage(string strbase64) { var encodedImage = strbase64.Split(',')[1]; var decodedImage = Convert.Fr
小语雀网
2021/09/08
9550
在NETCORE中,实现对AzureBLOB文件的上传下载操作
在之前的文章中,说到了SeaweedFS和MinIO,如果是使用的微软全家桶的话,那肯定就使用Azure Blob了,更直接、更简单和更高效。
老张的哲学
2023/08/23
5240
在NETCORE中,实现对AzureBLOB文件的上传下载操作
Python 技术篇-对音频、图片等文件进行base64编码和解码
最近在研究项目,需要调用百度语音的api,传入参数需要本地语音文件base64位编码后内容。下面来演示一下。 其实很简单,base64 是系统自带的库。 base64.b64encode() 进行编码。 base64.b64decode() 进行解码。 下面演示我读取 file1 文件,进行编码,然后再解码,保存为另一个 file2 文件。最后的 file1 和 file2 是一样的。 图片、音频等文件都是二进制的文件,所以读取和写入要用 rb 和 wb,都多个 b。
小蓝枣
2020/09/23
2.8K0
base64编码在silverlight中的使用
在传统的.net应用中,使用base64编码字符串是一件很轻松的事情,比如下面这段代码演示了如何将本地文件转化为base64字符串,并且将base64字符串又还原为图片文件. base64编码在传统.net程序中的应用(by 菩提树下的杨过 ) using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; namespace Base64Study { /// <summary> /// bas
菩提树下的杨过
2018/01/23
1.3K0
base64编码在silverlight中的使用
SharePoint下用C#代码上传文档至文档库的子文件夹中
SharePoint的文档库非常方便,可以管理日常的文档,更强大的是可以创建文件夹来分类,通常在UI界面上是非常简单了,点击文件夹,Create a Folder即可。但是,怎样手动去创建文件夹呢,怎
用户1161731
2018/01/11
2K0
SharePoint下用C#代码上传文档至文档库的子文件夹中
dateDiff在Objective-C中的实现
在学习iOS App开发中遇到需要计算时间差并格式化输出的需求,没有现成的方法,需要结合NSCalendar和NSDateComponents来实现。所以干脆把代码封装成一个熟悉的dateDiff方法。不过这个方法跟VB和sql里的dateDiff还是有点不一样,虽然可以封装成完全一样,不过我觉得直接返回NSDateComponents会更方便,因为所需要的各种单位上的值都包含在其中了。 我是把代码封装到自己的一个工具类KRUtils里作为类方法,使用起来也很方便。代码如下: /* dateDiff 方
小李刀刀
2018/03/06
1.4K0
Html5 FileReader 对文件进行Base64编码
以Base64进行编码的数据Url开始越来越广泛的被应用起来,原来做Base64转换要自己写一个小程序来转,其实Html5的FileReader的readAsDataURL方法读取出的数据就已经是Ba
葡萄城控件
2018/01/10
1.8K0
Html5 FileReader 对文件进行Base64编码
Groovy中 Base64 URL和文件名安全编码
Groovy支持Base64编码很长一段时间。 从Groovy 2.5.0开始,我们还可以使用Base64 URL和Filename Safe编码来使用encodeBase64Url方法对字节数组进行编码。 结果是一个Writable对象。 我们可以在Writable对象上调用toString方法来获得String值。 可以使用添加到String类的decodeBase64Url方法使用相同的编码对编码的String值进行解码。
白石
2019/08/23
1.3K0
Base64文件上传(Use C#)
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,它是一种基于64个可打印字符来表示二进制数据的方法。
宿春磊Charles
2022/03/29
3.7K0
原生js上传文件 发送JSON,XML,对请求的表单进行URL编码详解
HTML表单,当用户提交表单时,表单中的数据将会编码到字符串中,一并伴随着请求发送。
mySoul
2018/08/16
4.6K0
Linux下如何对目录中的文件进行统计
统计目录中文件的最简单方法是使用ls每行列出一个文件,并将输出通过管道符传递给wc计算数量:
用户1685462
2021/09/06
3K0
在Koa.js中实现文件上传的接口
文件上传是一个基本的功能,每个系统几乎都会有,比如上传图片、上传Excel等。那么在Node Koa应用中如何实现一个支持文件上传的接口呢?本文从环境准备开始、最后分别用 Postman 和一个HTML页面来测试。
张张
2019/12/27
4.8K0
Flask中的AJAX文件上传
表单: <form method="post" enctype=multipart/form-data id='form1'> <input class="form-control" id="image" name="image" required type="file"> <button type="submit" class="btn btn-default" id='submit1'>提交</button> </form> JS: <script> $('#image').change
YingJoy_
2018/09/14
2.7K0
PowerShell 批量签入SharePoint Document Library中的文件
由于某个文档库设置了编辑前签出功能,导致批量导入文件时这些文件默认的状态都被签出了。如果手动签入则费时费力,故利用PowerShell来实现批量签入Document Library中的文件。 Resolution Add-PSSnapin Microsoft.SharePoint.PowerShell function CheckInDocument([string]$url){ $spWeb=Get-SPWeb $url $spDocument=$spWeb.Lists.Tr
用户1161731
2018/01/11
1.3K0
在Objective-C中浅谈面向对象
  接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java。每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习OC的面向对象部分,又感觉到OC面向对象的特点。写篇博文总结一下OC中的面向对象。刚接触OC,用OC中的便利初始化方法和便利构造器有点蹩脚,不过还可以在接受的范围之内,以下的东西可能会对面向对象的特征:抽象,封装,继承等总结的较少一些,主要总结了OC中面向对象的特点。在用到便利构造器的时候,如果之前学习过设计模式的话会好理解一些。   在下面的代码实例
lizelu
2018/01/12
1.1K0
ActFramework中实现文件上传
ActFramework中实现文件上传 文件上传是一种常见的web应用功能。这篇小灶讲述如何在ActFramework中实现文件上传,包括单文件上传和多文件上传两种情况。 首先我们定义一个Model类Document用于演示单文件上传的情况: public class Document implements SimpleBean { public String desc; public String subject; public File attachment; publ
老码农
2018/06/27
6220
Vue中实现文件上传
为工具网 https://tool.misiyu.cn/qrcode 增加二维码上传识别功能。
无道
2019/11/12
2.9K0
慎用SharePoint.Files,在Power BI中更快地刷新Excel文件
最近在修改很久之前做的一个模型,发现仅仅只有3个excel文件,却刷新了1分21秒:
陈学谦
2021/12/01
5.6K0
慎用SharePoint.Files,在Power BI中更快地刷新Excel文件
Python 技术篇-用base64库对音频、图片等文件进行base64编码和解码实例演示
最近在研究项目,需要调用百度语音的api,传入参数需要本地语音文件 base64 位编码后内容。下面来演示一下。 其实很简单,base64 是系统自带的库。 base64.b64encode() 进行编码。 base64.b64decode() 进行解码。 下面演示我读取 file1 文件,进行编码,然后再解码,保存为另一个 file2 文件。最后的 file1 和 file2 是一样的。 图片、音频等文件都是二进制的文件,所以读取和写入要用 rb 和 wb,都多个 b。
小蓝枣
2022/05/07
3740
Python 技术篇-用base64库对音频、图片等文件进行base64编码和解码实例演示

相似问题

时间序列数据的Cassandra数据模型

11

Cassandra / Solr时间序列数据模型

14

基于时间序列和事件的Cassandra数据模型

11

用于有序范围查询的Cassandra数据模型

10

Cassandra时间序列查询

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文