Tag: 优化

解引用types的指针会破坏严格的别名规则

我使用下面的一段代码作为更大程序的一部分从文件中读取数据。 double data_read(FILE *stream,int code) { char data[8]; switch(code) { case 0x08: return (unsigned char)fgetc(stream); case 0x09: return (signed char)fgetc(stream); case 0x0b: data[1] = fgetc(stream); data[0] = fgetc(stream); return *(short*)data; case 0x0c: for(int i=3;i>=0;i–) data[i] = fgetc(stream); return *(int*)data; case 0x0d: for(int i=3;i>=0;i–) data[i] = fgetc(stream); return *(float*)data; case 0x0e: for(int i=7;i>=0;i–) data[i] = fgetc(stream); […]

什么是最小可能的有效PDF?

出于简单的好奇心,看到最小的GIF ,什么是最小的可能有效的PDF文件?

Python性能 – 你有没有必要重写别的东西?

有没有人有过Python的代码,结果不够快? 我的意思是,你被迫select另一种语言,因为它? 我们正在研究使用Python来处理几个较大的项目,我的感觉是,在大多数情况下,Python对于大多数场景来说足够快(相对于Java而言),因为它依赖于优化的C例程。 我想看看是否有人从Python开始, 但是由于性能的原因,最终还是要去别的地方。 谢谢。

将Sqrt(x)计算为x * InvSqrt(x)是否在Doom 3 BFG代码中有意义?

我浏览了最近发布的Doom 3 BFG源代码 ,当时我遇到了一些似乎没有任何意义的东西。 Doom 3将math函数包装在idMath类中。 一些函数只是从math.h获得相应的函数,但有些函数是重新实现(例如idMath :: exp16() ),我认为它们的性能要高于math.h (可能会牺牲精度)。 然而,让我感到困惑的是他们实现float idMath::Sqrt(float x)函数的方式: ID_INLINE float idMath::InvSqrt( float x ) { return ( x > FLT_SMALLEST_NON_DENORMAL ) ? sqrtf( 1.0f / x ) : INFINITY; } ID_INLINE float idMath::Sqrt( float x ) { return ( x >= 0.0f ) ? x * InvSqrt( x ) […]

.NET CLR是否真的为当前处理器优化?

当我读到像C#或Java这样的JITted语言的性能时,作者们通常会说理论上它们应该胜过许多本地编译的应用程序。 理论上说,本地应用程序通常只是针对处理器系列(如x86)进行编译,因此编译器无法进行某些优化,因为它们可能不会真正在所有处理器上进行优化。 另一方面,CLR可以在JIT过程中进行特定于处理器的优化。 有谁知道微软的(或者Mono的)CLR是否真的在JIT过程中执行特定于处理器的优化? 如果是这样,什么样的优化?

在Python中没有“+”运算符的string连接

我正在玩Python,我意识到我们不需要使用“+”运算符来连接string,除非直接使用。 例如: string1 = 'Hello' 'World' #1 works fine string2 = 'Hello' + 'World' #2 also works fine string3 = 'Hello' string4 = 'World' string5 = string3 string4 #3 causes syntax error string6 = string3 + string4 #4 works fine 现在我有两个问题: 为什么陈述3在陈述1不起作用? 报表1和报表2之间是否有计算速度等技术上的差异?

你有没有使用ngen.exe?

有没有人曾经使用ngen? 哪里? 为什么? 有没有任何性能改善? 何时何地使用它有意义?

图像压缩工具通过命令行

我正在寻找最好的工具来通过命令行压缩图像(PNG和JPEG)。 谷歌search后,我发现trimage这是好的,因为它压缩PNG和jepeg,但在这种情况下,压缩比很差。 我遇到了jpeg-optimizer.com在线工具,它的工作方式比trimage更好。 任何人都可以帮助find合适的工具。

expression式“j = ++(i | i); j = ++(i&i);应该是一个左值错误?

我期待在我的下面的代码: #include<stdio.h> int main(){ int i = 10; int j = 10; j = ++(i | i); printf("%d %d\n", j, i); j = ++(i & i); printf("%d %d\n", j, i); return 1; } expression式j = ++(i | i); 和j = ++(i & i); 会产生如下的左值错误: xc: In function 'main': xc:6: error: lvalue required as increment operand […]

现代C ++编译器的有效优化策略

我正在研究对性能至关重要的科学代码。 代码的初始版本已经被编写和testing,现在,使用Profiler,现在是时候从热点开始刮削周期了。 众所周知,一些优化,比如循环展开,现在由编译器处理得比用手工编程的程序员更有效。 哪些技术仍然值得? 很显然,我会通过一个分析器来运行所有的东西,但是如果有传统的智慧来判断哪些工作可以工作,哪些工作不工作,那将会为我节省很多时间。 我知道,优化是非常依赖于编译器和体系结构的。 我正在使用针对Core 2 Duo的英特尔C ++编译器,但是我也对gcc或者“任何现代编译器”都适用。 以下是我正在考虑的一些具体的想法: 用手工卷取代STL容器/algorithm有什么好处吗? 特别是,我的程序包含一个非常大的优先级队列(目前是一个std::priority_queue ),其操作花费了大量的时间。 这是值得研究的东西,还是STL实现可能是最快的? 沿着类似的路线,对于需要的大小未知,但有一个合理的小上限的std::vector s,用静态分配的数组replace它们是否有利呢? 我发现dynamic内存分配通常是一个严重的瓶颈,消除它会导致显着的加速。 因此,我很感兴趣的是,通过值返回大的临时数据结构与通过指针返回与通过引用传递结果的性能权衡。 有没有办法可靠地确定编译器是否将RVO用于给定的方法(当然,假设调用者不需要修改结果)? 编译器倾向于如何识别caching? 例如,是否值得重新sorting嵌套循环? 鉴于该计划的科学性,无处不在的浮点数。 我的代码中的一个重要瓶颈曾经是从浮点到整数的转换:编译器会发出代码来保存当前的舍入模式,更改它,执行转换,然后恢复旧的舍入模式 – 即使程序中没有任何内容曾改变舍入模式! 禁用此行为显着加快了我的代码。 是否有类似的浮点相关陷阱我应该知道? 单独编译和链接C ++的一个后果就是编译器无法做到看起来非常简单的优化,比如strlen()之类的方法调用超出了循环的终止条件。 有没有像这样的优化,我应该看看,因为它们不能由编译器完成,必须手工完成? 另一方面,是否有任何技术我应该避免,因为它们可能会干扰编译器自动优化代码的能力? 最后,扼杀某些种类的答案: 我知道优化在复杂性,可靠性和可维护性方面有成本。 对于这个特定的应用来说,性能的提高是值得的。 我知道最好的优化往往是提高高级algorithm,这已经完成了。