Tag: 优化

C#静态函数是否比非静态函数执行更好,超越了内存使用的减less?

我认为public或private static目标必须减less内存使用量,因为在内存中只有一个静态目标副本。 这似乎是因为一种方法是静态的,可能会使该方法成为CLR编译器进一步优化的一个潜在的点,超出了使用非静态函数的可能性。 只是一个脆弱的理论,所以我来问你们所有人。 static public或private方法提供了更多的性能优势,而不仅仅是减less内存使用量 (注意:我对那些谈论过早优化问题的反应并不感兴趣,当然这是我每天所遵循的合理build议,但这并不意味着有时候优化是不必要的(双重否定!)。让我放纵我的好奇心,至less)

Java预处理器

如果我有一个布尔字段如: private static final boolean DEBUG = false; 在我的代码中我有这样的陈述: if(DEBUG) System.err.println("err1"); Java预处理器是否摆脱了if语句和无法访问的代码?

浮点乘法与重复加法

设N是编译时无符号整数。 GCC可以优化 unsigned sum = 0; for(unsigned i=0; i<N; i++) sum += a; // a is an unsigned integer 只是a*N 这是可以理解的,因为模运算表示(a%k + b%k)%k = (a+b)%k 。 但是GCC不会优化 float sum = 0; for(unsigned i=0; i<N; i++) sum += a; // a is a float 到a*(float)N 。 但通过使用例如-Ofast关联math,我发现GCC可以按log2(N)步骤来减less这个。 例如,对于N=8它可以三次加法求和。 sum = a + a sum = sum […]

为什么GCC对C ++ <cmath>比C <math.h>更有效地实现isnan()?

这是我的代码: int f(double x) { return isnan(x); } 如果我#include <cmath>我得到这个程序集: xorl %eax, %eax ucomisd %xmm0, %xmm0 setp %al 这是相当聪明的: ucomisd设置奇偶标志,如果x与自己的比较是无序的,这意味着x是NAN。 然后, setp将奇偶校验标志复制到结果中(只有一个字节,因此最初清除%eax )。 但是,如果我#include <math.h>我得到这个程序集: jmp __isnan 现在代码不是内联的, __isnan函数当然不会快于ucomisd指令,所以我们已经发生了跳跃,没有任何好处。 如果我将代码编译为C,我会得到同样的结果 现在,如果将isnan()调用更改为__builtin_isnan() ,则无论我包含哪个头,都可以得到简单的ucomisd指令指令,而且它也可以在C中工作。 同样,如果我只是return x != x 。 所以我的问题是,为什么C <math.h>头提供了比C ++ <cmath>头更低效率的isnan()实现? 人们是否真的希望使用__builtin_isnan() ,如果是这样,为什么? 我在x86-64上使用-O2和-O3优化testing了GCC 4.7.2和4.9.0。

为什么不标记所有内联?

首先,我不想要强制编译器内联每个函数的实现。 为了减less误导的答案的水平,请确保您了解inline关键字的实际含义。 这里是很好的描述, 内联vs静态vs外部 。 所以我的问题,为什么不标记每个函数定义inline ? 理想情况下,唯一的编译单元是main.cpp 。 或者可能还有一些不能在头文件中定义的函数(pimpl idiom等)。 这个奇怪的请求背后的理论是它会给优化器最大的信息工作。 它当然可以内联函数实现,但是它也可以做“跨模块”优化,因为只有一个模块。 还有其他优点吗? 有没有人用真正的应用程序试过这个? 表演增加了吗? 减less?!? inline标记所有函数定义有什么缺点? 编译可能会更慢,会消耗更多的内存。 迭代构build被破坏,整个应用程序将需要在每次更改后重build。 链接时间可能是天文数字 所有这些缺点只会影响开发者。 什么是运行时间的缺点?

编译器中的布尔值为8位。 对他们的操作是低效的吗?

我正在阅读Agner Fog的“ 用C ++优化软件 ”(针对Intel,AMD和VIA的x86处理器),它在第34页 布尔variables存储为8位整数,值为0表示为false,1表示为true。 布尔variables是超定的,因为所有具有布尔variables作为input的运算符都检查input是否具有除0或1之外的其他值,但具有布尔值作为输出的运算符不能产生除0或1之外的其他值。作为input的布尔variables效率低于必要的。 这是今天仍然如此,编译器是什么? 你能举个例子吗? 作者说 如果能够确定地知道操作数不具有除0和1之外的其他值,则可以使布尔操作更加高效。编译器没有做出这样的假设的原因是如果variables可能具有其他值未初始化或来自不明的来源。 这是否意味着,如果我拿一个函数指针bool(*)()为例,并调用它,那么对它的操作产生低效的代码? 或者,当我通过解引用指针或从引用读取来访问布尔值,然后对其进行操作时,情况就是这样吗?

用NumPy快速旋转张量

在应用程序的核心(用Python编写,使用NumPy )我需要旋转一个四阶张量。 实际上,我需要旋转许多张力,这是我的瓶颈。 我涉及八个嵌套循环的天真实现(下面)似乎很慢,但是我看不到一种方法来利用NumPy的matrix运算,希望能够加快速度。 我有一种感觉,我应该使用np.tensordot ,但我不知道如何。 在math上,旋转张量的元素T'由下式给出:其中,总和在右侧的重复指数之上。 T和Tprime是3 * 3 * 3 * 3的NumPy数组,旋转matrixg是3 * 3的NumPy数组。 我的执行速度很慢(每次调用时间大约为0.04秒)。 #!/usr/bin/env python import numpy as np def rotT(T, g): Tprime = np.zeros((3,3,3,3)) for i in range(3): for j in range(3): for k in range(3): for l in range(3): for ii in range(3): for jj in range(3): for kk […]

SQL Server Management Studio – 改进TSQL编码过程的技巧

我曾经在一个普遍使用Pair Programming的地方工作。 我记得在代码上一起工作时,我们可以相互学习多less个小东西。 随着时间的推移拾取新的快捷方式,代码片段等显着提高了我们编写代码的效率。 自从我开始使用SQL Server以来,我一直都是自己做的。 我通常会select与其他人一起工作的最好的习惯,而现在我不能这样做。 所以这里是一个问题: 关于使用SQL Server Management Studio有效编写TSQL代码的技巧? 请保持提示2 – 3的东西/捷径,你认为提高你的编码速度 请保持在TSQL和SQL Server Management Studio 2005/2008的范围内如果该function特定于Management Studio的版本,请指明:例如“仅适用于SQL Server 2008” 编辑: 恐怕我可能被你们中的一些人误解了。 我不是在寻找编写高效TSQL代码的技巧,而是寻求如何有效地使用Management Studio来加速编码过程本身的build议。 我正在寻找的答案types是: 使用模板, 键盘快捷键, 使用IntelliSense插件等 基本上那些使编码体验更有效和愉快的小事情。

哪个更好:书签/密钥查找或索引扫描

我知道索引search比索引扫描要好,但在SQL Server解释计划中更可取:Index seek或Key Lookup(SQL Server 2000中的书签)? 请告诉我他们没有再次更改SQL Server 2008的名称…

哪个更快:清除收集或实例化新的

我的代码中有一些通用列表,有几十个或几百个元素。 有时我需要用其他对象重新填充这个列表,所以问题是:调用Clear()方法或创build一个new List<T>()会更快?