Tag: 优化

在发布模式下,代码行为不像预期的那样

以下代码在debugging模式和发行模式(使用Visual Studio 2008)下生成不同的结果: int _tmain(int argc, _TCHAR* argv[]) { for( int i = 0; i < 17; i++ ) { int result = i * 16; if( result > 255 ) { result = 255; } printf("i:%2d, result = %3d\n", i, result) ; } return 0; } debugging模式的输出如预期的那样: i: 0, result = 0 i: 1, […]

切换if-else语句的优点

使用switch语句的最佳做法是使用30个unsigned枚举的if语句,其中大约10个具有预期的操作(目前是相同的操作)。 性能和空间需要考虑,但并不重要。 我已经抽象了这个片段,所以不要因为命名惯例而恨我。 switch语句: // numError is an error enumeration type, with 0 being the non-error case // fire_special_event() is a stub method for the shared processing switch (numError) { case ERROR_01 : // intentional fall-through case ERROR_07 : // intentional fall-through case ERROR_0A : // intentional fall-through case ERROR_10 : // intentional fall-through case […]

在C ++ 0x中优化掉“while(1);”

更新,见下文! 我听说过,C ++ 0x允许编译器在下面的代码片段中打印“Hello” #include <iostream> int main() { while(1) ; std::cout << "Hello" << std::endl; } 这显然与线程和优化function有关。 在我看来,这可以让很多人感到惊讶。 有人有一个很好的解释,为什么这是必要的允许? 作为参考,最新的C ++ 0x草案在6.5/5说 一个循环,在for语句的for-init语句之外, 不会调用库I / O函数,并且 不访问或修改易失性对象, 不执行同步操作(1.10)或primefaces操作(第29章) 可能由执行方式假定终止。 [注意:这是为了允许编译器转换,例如删除空循环,即使在无法证实终止的情况下也是如此。 – 结束注意] 编辑: 这篇富有洞察力的文章谈到了这个标准文本 不幸的是,没有使用“未定义的行为”这个词。 然而,只要标准说“编译器可以承担P”,就意味着具有属性not-P的程序没有定义语义。 这是否正确,编译器是否允许为上述程序打印“再见”? 这里有一个更有洞察力的线索 ,是关于对C的一个类似的改变,由Guy做了上面的链接文章。 除了其他有用的事实,他们提出了一个似乎也适用于C ++ 0x的解决scheme( 更新 :这将不再适用于n3225 – 见下文!) endless: goto endless; 编译器不允许优化,看来,因为它不是一个循环,而是一个跳转。 另一个家伙总结了C ++ 0x和C201X的改进build议 通过编写一个循环,程序员断言循环执行一些具有可见行为的事情(执行I […]

超越堆栈采样:C ++ Profiler

黑客的故事 这个date是12/02/10。 圣诞节前的日子正在stream逝,我几乎是一个Windows程序员打了一个主要的路障。 我一直在使用AQTime,我试过困,有光泽,很困,而且正如我们所说,VTune正在安装。 我试图使用VS2008分析器,这是积极的惩罚,以及往往不知情。 我使用了随机暂停技术。 我已经检查了一些调用树。 我发射了function痕迹。 但是令人痛心的事实是,我正在使用的应用程序有超过一百万行代码,可能还有另外一百万行第三方应用程序。 我需要更好的工具。 我读过其他主题。 我已经尝试了每个主题中列出的每个分析器。 只要有一些比这些垃圾和昂贵的select更好的东西,或者可笑的工作量几乎没有收获。 更复杂的是,我们的代码是高度线程化的,并且运行了一些Qt事件循环,其中一些是非常脆弱的,由于时间延迟,它们在沉重的仪器下崩溃。 不要问我为什么要运行多个事件循环。 没有人能告诉我。 Valgrind在windows环境下有更多的select吗? 有没有什么比我已经尝试过的那些破碎的工具更好? 是否有任何devise与Qt集成,可能与队列中的事件有用的显示? 我试过的工具的完整列表,以及那些在斜体中非常有用的工具: AQTime:相当好! 深度recursion有一些问题,但在这些情况下调用图是正确的,可以用来清除你可能有的任何混淆。 不是一个完美的工具,但值得尝试。 这可能适合你的需求,大部分时间对我来说确实够好。 debugging模式下的随机暂停攻击:没有足够的信息足够的时间。 一个好工具,但不是一个完整的解决scheme 平行工作室:核select。 突兀,怪异,疯狂的强大。 我认为你应该进行30天的评估,并确定它是否合适。 它也很酷。 AMD Codeanalyst:精彩,易于使用,非常容易崩溃,但我认为这是一个环境问题。 我build议尝试一下,因为它是免费的。 Luke Stackwalker:在小型项目上工作得很好,有点试图让它在我们的工作。 一些好的结果,但它绝对取代了我的个人任务的睡眠。 PurifyPlus:不支持Win-x64环境,最显眼的是Windows 7。 我在其他部门的一些同事发誓。 VS2008 Profiler:以所需的分辨率在function跟踪模式下产生100 +演出范围内的输出。 从正面来看,产生稳固的结果。 GProf:要求海湾合作委员会甚至适度有效。 VTune:VTune的W7支持犯罪分子。 否则优秀 个人识别码:我需要破解我自己的工具,所以这是不得已而为之的。 昏昏欲睡\ VerySleepy:有用的小型应用程序,但在这里失败。 EasyProfiler:不错,如果你不介意一些手动注入的代码来指示在哪里工具。 Valgrind:只有nix,但是当你在这个环境里时,它是非常好的。 OProfile:仅限Linux。 Proffy:他们拍野马。 我还没有尝试过的build议工具: XPerf: […]

为什么(a%256)与(a&0xFF)不同?

我总是假设在做(a % 256) ,优化器自然会使用有效的按位操作,就好像我写了(a & 0xFF) 。 在编译器浏览器gcc-6.2(-O3)上testing时: // Type your code here, or load an example. int mod(int num) { return num % 256; } mod(int): mov edx, edi sar edx, 31 shr edx, 24 lea eax, [rdi+rdx] movzx eax, al sub eax, edx ret 而当尝试其他代码: // Type your code here, or load an […]

如果该行或列包含0,则将matrix中的每个单元格设置为0

给定一个0和1的N×Nmatrix。 将包含0的所有行全部设置为0 ,并将每个包含0列全部设置为0 。 例如 1 0 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 结果是 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 […]

为什么提前回报比其他回报慢?

这是我几天前回答的后续问题。 编辑:这个问题的OP似乎已经使用我发布给他的代码来问同样的问题 ,但我没有意识到这一点。 道歉。 虽然提供的答案是不同的! 基本上我观察到: >>> def without_else(param=False): … if param: … return 1 … return 0 >>> def with_else(param=False): … if param: … return 1 … else: … return 0 >>> from timeit import Timer as T >>> T(lambda : without_else()).repeat() [0.3011460304260254, 0.2866089344024658, 0.2871549129486084] >>> T(lambda : with_else()).repeat() [0.27536892890930176, 0.2693932056427002, 0.27011704444885254] >>> T(lambda […]

g ++中的优化级别-O3是否危险?

我已经从各种来源(尽pipe大部分来自我的一位同事)得知,在g++中编译-O3的优化级别是某种“危险的”,除非certificate是必要的,否则应该避免。 这是真的吗?如果是这样,为什么? 我应该坚持-O2吗?

迪斯尼的FastPass有效和/或有用的排队理论

在迪斯尼世界,他们使用Fastpass系统为受欢迎的游乐设施制作第二条较短的路线。 这个想法是,你可以等待标准线,经常等待一个多小时,或者你可以得到一个FastPass,它允许你在指定的时间段内(通常在几个小时之后)回来,只等10分钟或更less。 您只能使用FastPass一次“等”一次。 我一直在试图弄清楚这个概念背后的排队理论,但是我发现唯一的解释是它的目的是让人们脱离线路,做一些会带来额外收入的东西(购物,吃东西等等)。 这就是为什么FastPass被实现的原因,还是存在真正的游客效率问题? 有没有应用软件类似的逻辑? 有软件应用程序应该应用类似的逻辑吗? 我看到在软件中实现类似的问题的一部分是,它是基于用户select他们的队列。 为了在软件中实现更快的等待周期,我认为这个理论的一个很好的应用将要求应用程序足够聪明,根据自己的需求知道将什么队列放入,而不需要最终用户的select。

棘手的Google面试问题

我的一个朋友正在面试工作。 其中一个面试问题让我思考,只是想得到一些反馈。 有2个非负整数:我和j。 给定以下等式,find一个(最优)解决scheme来迭代i和j,使得输出被sorting。 2^i * 5^j 所以前几轮看起来像这样: 2^0 * 5^0 = 1 2^1 * 5^0 = 2 2^2 * 5^0 = 4 2^0 * 5^1 = 5 2^3 * 5^0 = 8 2^1 * 5^1 = 10 2^4 * 5^0 = 16 2^2 * 5^1 = 20 2^0 * 5^2 = 25 尝试我可能,我看不到一个模式。 你的想法?