草庐IT

PERFORMANCE

全部标签

c++ - 算法:计算单词列表频率的更好方法

这个问题实际上很简单,但我想在开始编码之前先听听一些想法。给定一个文件,每行都有一个单词,计算出现频率最高的n个数字。不幸的是,我首先想到的是使用std::map。我知道C++的同行们会说unordered_map非常合理。我想知道是否可以在算法方面添加任何内容,或者这基本上只是“谁选择最佳数据结构谁获胜”类型的问题。我在互联网上搜索过它并阅读了哈希表和优先级队列可能会提供一个运行时间为O(n)的算法,但是我认为实现起来会很复杂有什么想法吗? 最佳答案 用于此任务的最佳数据结构是Trie:http://en.wikipedia.or

c++ - 派生类调用时的虚函数性能?

如果在编译时从已知为派生类的类调用虚拟方法,是否会导致性能下降?下面我使用派生类显式调用force_speak。代码:#include#include#includeclassBase{public:virtualvoidspeak(){std::coutvoidforce_speak(std::array,3>&arr){for(auto&b:arr){b->speak();}}intmain(){std::array,3>arr={std::unique_ptr(newDerived1),std::unique_ptr(newDerived1),std::unique_ptr(ne

c++ - std::pow 不同指数的行为非常不同

我目前正在尝试优化一些代码,其中50%的时间花费在std::pow()上。我知道指数将始终为正整数,而底数将始终为区间(0,1)中的double。为了好玩,我写了一个函数:inlinedoubleint_pow(doublebase,intexponent){doubleout=1.0;for(inti=0;i我正在编译:>g++fast-pow.cpp-O3--std=c++11我在(0,1)之间生成了1亿个double,并比较了(1)std::pow(2)我自制的int_pow函数的时间以及(3)直接乘法。这是我的计时程序的草图(这是一个非常快速的组合测试):voidtime_me

C++:从星号不是乘法符号的字符串中删除所有星号

所以基本上,我可能有一些字符串看起来像:“嘿,这是一个字符串*这个字符串很棒97*3=27*这个字符串很酷”。但是,这个字符串可能很大。我试图从字符串中删除所有星号,除非该星号似乎代表乘法。效率在这里有点重要,我很难想出一个好的算法来从中删除所有非乘法星号。为了确定星号是否代表乘法,显然我可以检查它是否夹在两个数字之间。因此,我想我可以做类似(伪代码)的事情:wasNumber=falseLoopthroughstringifnumbersetwasNumber=trueelsesetwasNumber=falseifasteriskifwasNumberifthenextwordis

c++ - OpenMP shared vs. firstprivate performancewise

我在类方法中有一个#pragmaompparallelfor循环。每个线程只读访问很少的方法局部变量,很少调用私有(private)数据和方法的参数。所有这些都在shared子句中声明。我的问题:性能方面应该没有任何区别声明这些变量shared或firstprivate。对吧?如果我不小心让变量不共享相同的缓存行,是否也是如此?如果其中一个共享变量是一个指针,并且在线程内我通过它读取一个值,是否存在像普通循环中那样的别名问题?明天我将尝试分析我的代码。同时感谢您的建议! 最佳答案 嗯,它们不是一回事。使用shared,它们在所有线程

c++ - 为什么一个线程比调用一个函数更快,mingw

当我调用函数时,执行时间是6.8秒。从线程调用它的时间是3.4秒当使用2线程时1.8秒。无论我使用什么优化,口粮都保持不变。在VisualStudio中,时间与预期的一样,分别为3.1、3和1.7秒。#include#include#include#includeusingnamespacestd;#defineN400floata[N][N];structb{intbegin;intend;};DWORDWINAPIthread(LPVOIDp){bb_t=*(b*)p;for(inti=0;i时间:0-68681-33622-1827CPU-酷睿2双核T9300操作系统-Windo

c++ - 使用 XMM0 寄存器和内存提取(C++ 代码)比仅使用 XMM 寄存器的 ASM 快两倍 - 为什么?

我正在尝试实现一些内联汇编程序(在VisualStudio2012C++代码中)以利用SSE。我想将7个数字相加1e9次,所以我将它们从RAM放置到xmm0到CPU的xmm6寄存器。当我使用以下代码在visualstudio2012中使用内联汇编时:C++代码:for(inti=0;i我的ASM代码:intcount=1000000000;doubleresVal=0.0;//placingvaluestoregister__asm{movsdxmm0,val1;placingvar1inxmm0registermovsdxmm1,val2movsdxmm2,val3movsdxmm3

c++ - C 与 C++ 的数值模拟(性能)

我即将编写一个离格扩散受限聚合(DLA)模拟,我想知道是使用C还是C++。出于设计原因,C++会很好,但我想知道C是否会执行得更好。我当然知道算法的性能,并选择了最好的算法。所以我不是在谈论将O(n^2)改进为O(logn)或类似的东西。可以这么说,我正在尝试减少常数。如果您不知道DLA,它基本上可以归结为拥有一个double组(大小在10^3和10^6之间),并在一个循环中选择随机double来比较(大于/小于)大部分数组。因此,对此重要的性能差异是数据访问和调用函数:数据访问:C结构与具有公共(public)数据成员的C++类与具有私有(private)数据成员和访问器的C++类。

c++ - 什么时候在函数中对 const 值使用 const 引用?

在64位系统上,const&是8个字节。对于小于8字节的值和对象,按值传递比按引用传递更有意义。即使是一个8字节的对象,复制也比传递引用然后访问该对象的成本更低。在什么阈值下您应该更喜欢const引用而不是const值? 最佳答案 Forvaluesandobjectssmallerthan8bytes,itmakessensetopassbyvalueratherthanreference.Evenan8byteobjectischeapertocopythantopassthereference,thenaccesstheobj

c# - C++ 和适当的 TDD

嗨!我最近尝试用C#开发一个小型项目,在整个项目中,我们的团队使用了测试驱动开发(TDD)技术(xunit,moq).我真的认为这很棒,因为(与C#配对时)这种方法允许在编码时放松,在投影时放松,在重构时放松。我怀疑所有这些TDD-东西实际上简化了编码过程,而且,它允许(最终,对我来说)用更少的脑细胞工作得到相同的结果。在那之后,我尝试将TDD与C++搭配使用(我使用了GoogleTest和GoogleMock库),而且,我不知道为什么,但实际上我认为TDD在快速应用程序开发方面是倒退了一步。有时我不得不花大量时间思考我的测试、构建适当的模拟、重建它们并对着我的显示器发誓。而且,好吧,