草庐IT

PERFORMANCE

全部标签

c++ - 使用 GCC 洗牌巨大位 vector 的最有效方法是什么

我有两个非常大的位vector(每个大约1GB),我想打乱它们按照以下方式:第一个位vector:a[0],a[1],a[n]第二位vector:b[0],b[1],b[n]结果应该是这样的:c[0]=a[0]c[1]=b[0]c[2]=a[1]c[3]=b[1]在C++中使用新英特尔处理器的vector运算最有效的方法是什么?我想使用GCC来做到这一点。 最佳答案 你可以尝试滚动你自己的循环--intch1,ch2;while((ch1=fgetc(fp1))!=EOF&&(ch2=fgetc(fp2))!=EOF){inti,d

c++ - SQLite 真的很慢

我一直在努力让sqlite在我的C++程序中更快。我认为结果与预期的相去甚远。我在数据库中有几张表,其中大部分有几条记录,还有一张有大量记录(4986450)。真的很难达到这个大小,因为每个事务的插入太多,而且插入速度很慢。另一方面,现在我正在那个大表上做一个简单的查询,比如sqlite3_prepare_v2(db,"SELECT*FROMTablewhereprimary_key=?1;",-1,&query,NULL);sqlite3_exec(db,"BEGINTRANSACTION",NULL,NULL,&sErrMsg);....while(running){sqlite3

C++ 独立数据的多线程性能

让我们创建一个只有一个数据成员的非常简单的C++类:classContainer{public:std::vectorelements;Container(intelemCount);};现在创建N个线程来完成一个非常简单的任务:创建一个具有特定vector大小的本地Container遍历vector并简单地增加每个元素的val重复步骤210.000次(以秒而不是毫秒为单位获取时间)完整的代码list可以在Pastebin上找到根据CoreInfo我的CPU(IntelCorei52400)有4个内核,每个内核都有自己的L1/L2缓存:LogicaltoPhysicalProcesso

c++ - boost::dynamic_bitset 连接性能

我想以一种不会降低性能的方式连接一个大的位集和一个较小的位集。目前,我的应用程序仅在以下代码中就花费了20%的CPU时间:boost::dynamic_bitsetencode(conststd::vector&data){boost::dynamic_bitsetresult;std::for_each(data.begin(),data.end(),[&](unsignedcharsymbol){for(size_tn=0;n我读过这个post它提出了一个解决方案,不幸的是,它对我不起作用,因为目标位集和源位集的大小差异非常大。有什么想法吗?如果使用boost::dynamic_b

c++ - 线程安全队列是一种好方法吗?

我正在寻找一种方法来优化我开发的开源项目的以下代码,或者通过将繁重的工作转移到另一个线程来boost它的性能。voidProfilerCommunication::AddVisitPoint(ULONGuniqueId){CScopedLocklock(m_mutexResults);m_pVisitPoints->points[m_pVisitPoints->count].UniqueId=uniqueId;if(++m_pVisitPoints->count==VP_BUFFER_SIZE){SendVisitPoints();m_pVisitPoints->count=0;}}以

c++ - C++ 性能技术报告 TR 18015 中使用了哪些实现?

在TechnicalReportonC++Performance有很多表格比较了C++的不同实现。不幸的是,没有提到所使用的操作系统和编译器。我想知道这些信息是否可以通过非官方方式获得,或者至少可以从技术报告本身中推断出来。 最佳答案 从报告的第23页开始:“大多数关于运行时成本的评论都是基于一组简单的测量,这些测量是在三种不同的机器架构上使用六种不同的编译器执行的,这些编译器使用各种优化选项运行.每个测试都运行多次以确保结果是可重复的.代码在附录D中给出:.这些测量的目的既不是为了获得C++在给定机器上的最佳性能的精确陈述,也不是

c++ - 有什么好的方法可以指示计算机是否可以运行特定的程序/软件?

如果计算机能够使用纯JavaScript(GoogleV8)、C++(Windows、MacOS和Linux)运行程序/软件而没有任何性能问题,是否有任何好的方法可以通过要求尽可能少尽可能从软件创建者那里获得信息(例如CPU分数、GPU分数)?这样我可以很好地指示我的用户他们的计算机是否足以运行该软件,因此用户不需要从一开始就下载并安装它,如果她/他不能无论如何都要运行它。我想到类似“分数”的指示:CPU:230000(genericprocessorscore)GPU:40000(genericGPUscore)+Network/FileI/Oread/writerequiremen

c++ - 使用 O(1) 元素访问在 Haskell 中实现高效的类似 zipper 的数据结构

问题我想创建一个数据类型,允许快速访问和修改其元素。是否可以在Haskell中创建一个结构和函数,其执行速度与简单的C++实现一样快?问题详情我正在用Haskell编写一个编译器。我有AST由数据类型表示,让我们考虑以下一个:importPreludehiding(id)--thisisasampledatatype,therealonehasgotalotofconstructorsdataAST=A{id::Int,x::AST,y::AST,z::AST}|B{id::Int}|C{id::Int,x::AST,y::AST}|D{id::Int,u::AST,v::AST,w:

c++ - 快速访问矩阵

我需要使用C++代码访问二维矩阵。如果矩阵是mat[n][m],我必须访问(在for循环中)这些位置:mat[x][y],mat[x-1][y-m-1],mat[x-1][y],mat[x][y-1]在下一次迭代中我必须做的:x=x+1然后,再次:mat[x][y],mat[x-1][y-m-1],mat[x-1][y],mat[x][y-1]让这些位置在内存中最近以加速我的代码的最佳方法是什么? 最佳答案 如果您要水平迭代,请将您的矩阵排列为mat[y][x],尤其是当它是一个数组数组时(矩阵的布局在您的答案中不明确)。

c++ - 覆盖 operator new 以合并 PIMPL 分配

PIMPL习语通常用于对象的公共(public)API,有时也包含虚函数。在那里,堆分配通常用于分配多态对象,然后将其存储在unique_ptr或类似的地方。一个著名的例子是QtAPI,其中大多数对象(尤其是QWidgets等)在堆上分配并由QObject父/子关系跟踪。因此,我们为两次分配支付费用,一次是对象本身使用2*sizeof(void*)来保存PIMPL和v_table指针,一次是私有(private)数据本身。现在来回答我的问题:我想知道这两个分配是否可以合并,类似于make_shared应用的优化。然后我想知道这种优化是否值得,因为malloc的实现可能非常擅长处理字大小