草庐IT

OPTIMIZATION

全部标签

c++ - 如何优化最长公共(public)子序列的 O(m.n) 解决方案?

给定两个字符串,长度为x1的字符串X和长度为y1的字符串Y,找出两个字符串中从左到右(但不一定在连续block中)出现的最长字符序列。e.gifX=ABCBDABandY=BDCABA,theLCS(X,Y)={"BCBA","BDAB","BCAB"}andLCSlengthis4.我使用了这个问题的标准解决方案:if(X[i]=Y[j]):1+LCS(i+1,j+1)if(X[i]!=Y[j]):LCS(i,j+1)orLCS(i+1,j),whicheverisgreater然后我使用了内存,使它成为一个标准的DP问题。#include#includeusingnamespace

c++ - 两个8位数组协方差的快速实现

我需要比较大量相似的小尺寸图片(最大200x200)。所以我尝试实现SSIM(结构相似性参见https://en.wikipedia.org/wiki/Structural_similarity)算法。SSIM需要计算两个8位灰度图像的协方差。一个简单的实现如下所示:floatSigmaXY(constuint8_t*x,constuint8_t*y,size_tsize,floataverageX,floataverageY){floatsum=0;for(size_ti=0;i但是性能很差。所以我希望用SIMD或者CUDA来改进一下(听说可以)。不幸的是,我没有这样做的经验。它看起

c++ - 是否值得声明作为参数传递的数组的(常数)大小?

constintN=100;voidfunction1(intarray[]){//...}voidfunction2(intarray[N]){//...}intmain(intargc,char*argv[]){inta[N]={1,2,3,...,100};function1(a);function2(a);return0;}我想知道function2是否有可能比function1由于某种类型的C++编译器优化(例如,编译器计算出sizeof(array)在编译时)。对于C,同样的话题之前在这里争论过:ShouldIdeclaretheexpectedsizeofanarrayp

c++ - GLSL隔行扫描

我想使用GLSL在交错模式下高效渲染。我完全可以这样做:vec4background=texture2D(plane[5],gl_TexCoord[1].st);if(is_even_row(gl_TexCoord[1].t)){vec4foreground=get_my_color();gl_FragColor=vec4(fore.rgb*foreground.a+background.rgb*(1.0-foreground.a),background.a+fore.a);}elsegl_FragColor=background;然而,据我所知,GLSL中分支的本质是两个分支都将实际

c++ - 具有常量变量的类的多个实例对常量使用相同的内存?

如果我有一个像这样定义多个常量变量的类......classSomeClass{public:SomeClass():SOME_CONSTANT(20),ANOTHER_CONSTANT(45),ANOTHER_CONSTANT2(25),ANOTHER_CONSTANT2(93){}private:constintSOME_CONSTANT;constintANOTHER_CONSTANT;constintANOTHER_CONSTANT2;constintANOTHER_CONSTANT3;是否会优化此类的多个实例以指向常量的同一内存?或者我可以通过将每个常量设为静态来节省内存吗?

c++ - NVI 和去虚拟化

如果您使用的是NVI,编译器可以去虚拟化函数调用吗?一个例子:#includeclasswidget{public:voidfoo(){bar();}private:virtualvoidbar()=0;};classgadgetfinal:publicwidget{private:voidbar()override{std::cout在标记的行中,编译器可以将对bar的调用去虚拟化吗? 最佳答案 鉴于g的动态类型恰好是gadget,编译器可以在内联后去虚拟化对bar的调用>foo,无论在classgadget声明中还是在gadge

java - 是否有理由使用字符串 => 索引到 vector 的映射,而不是字符串 => 对象?

如果我有一个对象集合,我希望能够通过名称进行查找,我当然可以使用{string=>object}映射。是否有理由使用对象的vector以及{string=>此vector中的索引}伴侣映射?这些年来我看到很多开发者都这样做,我基本上不认为这是开发者不熟悉map或感到困惑的迹象。但最近几天,我开始反射(reflection)自己,我担心我可能会错过潜在的优化或其他东西,尽管我终生无法弄清楚哪些可以优化。 最佳答案 我能想到的原因有一个:除了按名称查找对象外,有时您还想尽可能高效地遍历所有对象。使用map+vector可以实现这一点。通

c++ - gcc/C++ : If CPU load is low, 那么代码优化没什么用,对吗?

我的同事喜欢使用带“-g-O0”的gcc来构建生产二进制文件,因为如果发生核心转储,调试很容易。他说不需要使用编译器优化或调整代码,因为他发现生产过程中的CPU负载不高,例如30%左右。我问他原因,他告诉我:如果CPU负载不高,瓶颈一定不是我们的代码性能,应该是一些IO(磁盘/网络)。因此,使用gcc-O2无法改善延迟和吞吐量。这也表明我们在代码中没有太多需要改进的地方,因为CPU不是瓶颈。对吗? 最佳答案 关于CPU使用~优化我希望程序中的大多数优化问题都与高于平常的CPU负载相关,因为我们说次优程序做的比理论上需要的多。但这里的

c++ - VS : unexpected optimization behavior with _BitScanReverse64 intrinsic

以下代码在Debug模式下工作正常,因为定义了_BitScanReverse64如果没有设置Bit则返回0。CitingMSDN:(返回值是)“如果设置了索引则为非零,如果未找到设置位则为0。”如果我在Release模式下编译这段代码它仍然有效,但如果我启用编译器优化,例如\O1或\O2索引不为零并且assert()失败。#include#includeusingnamespacestd;intmain(){unsignedlongindex=0;_BitScanReverse64(&index,0x0ull);cout这是预期的行为吗?我正在使用VisualStudioCommuni

c++ - 当两个 std::complex 相乘时,为什么调用 __muldc3?

我天真地假设,复数乘法将由编译器内联,例如对于这个函数:#includevoidmult(std::complex&a,std::complex&b){a*=b;}但是,当由gcc(使用-O2)编译时,resultingassembler令人惊讶(至少对我而言):mult(std::complex&,std::complex&):pushq%rbxmovsd8(%rdi),%xmm3movsd(%rdi),%xmm2movq%rdi,%rbxmovsd8(%rsi),%xmm1movsd(%rsi),%xmm0call__muldc3movsd%xmm0,(%rbx)movsd%xmm