任何人都可以举一个例子或链接到一个在GCC中使用__builtin_prefetch的例子(或者只是一般的asm指令prefetcht0)来获得实质的性能优势吗? 特别是,我希望例子符合以下标准: 这是一个简单,小巧,独立的例子。 删除__builtin_prefetch指令会导致性能下降。 将__builtin_prefetch指令replace为相应的内存访问会导致性能下降。 也就是说,我想最短的例子显示__builtin_prefetch执行优化,没有它不能pipe理。
我有一个function,操纵一个非常大的名单,超过约25万件。 对于大多数这些项目,它只是取代位置x的项目。 但是,其中约5%的人必须将其从名单中删除。 使用LinkedList似乎是避免昂贵的清除的最明显的解决scheme。 然而,自然地,随着时间的推移,索引访问LinkedList变得越来越慢。 这里的成本是几分钟(其中很多)。 在这个LinkedList上使用迭代器也很昂贵,因为我似乎需要一个单独的副本来避免编辑该列表时出现Iterator并发问题。 这里的成本是几分钟。 但是,这里是我的头脑被吹了一下。 如果我更改为一个ArrayList,它几乎立即运行。 对于包含297515个元素的列表,删除11958个元素并修改其他所有内容需要909ms。 我证实,结果列表的大小确实是285557,并且包含我需要的更新信息。 为什么这么快? 我在JDK6中查看了ArrayList的源代码,它似乎正在按照预期使用arraycopy函数。 我很想理解为什么一个ArrayList在这里工作得很好,当常识似乎表明这个任务的数组是一个可怕的想法,需要移动数十万个项目。
我发现了一个相当奇怪的但是工作的float的平方根逼近; 我真的不明白。 有人可以解释我为什么这个代码的作品? float sqrt(float f) { const int result = 0x1fbb4000 + (*(int*)&f >> 1); return *(float*)&result; } 我已经testing了一下, 它输出的值从std::sqrt()大约1到3% 。 我知道Quake III的快速倒数平方根 ,我猜这是类似的东西(没有牛顿迭代),但是我真的很感激它的解释。 (nota:我已经标记了c和c ++,因为它们都是有效的,ish(参见注释)C和C ++代码)
当我用Python编写代码时,我经常需要根据一些标准从列表或其他序列types中删除项目。 我还没有find一个优雅高效的解决scheme,因为从当前正在迭代的列表中删除项目是不好的。 例如,你不能这样做: for name in names: if name[-5:] == 'Smith': names.remove(name) 我通常最终会做这样的事情: toremove = [] for name in names: if name[-5:] == 'Smith': toremove.append(name) for name in toremove: names.remove(name) del toremove 这是不够的,相当丑陋的,可能是越野车(它如何处理多个“约翰·史密斯”的条目?)。 有没有人有一个更优雅的解决scheme,或者至less更有效的? 如何与字典一起工作?
考虑以下使用new简单代码(我知道没有delete[] ,但它不涉及这个问题): int main() { int* mem = new int[100]; return 0; } 编译器是否允许优化new调用? 在我的研究中, g ++(5.2.0)和Visual Studio 2015没有优化new调用, 而铿锵(3.0+) 。 所有的testing都是在启用完全优化的情况下完成的(-O3代表g ++和clang,Visual Studio的发布模式)。 是不是new进行下的系统调用,使编译器不可能(和非法)优化呢? 编辑 :我现在已经从程序中排除了未定义的行为: #include <new> int main() { int* mem = new (std::nothrow) int[100]; return 0; } 铿锵3.0不会优化出来 ,但后来的版本 。 编辑2 : #include <new> int main() { int* mem = new […]
有时我运行一个Postgres查询需要30秒。 然后,我马上运行相同的查询,它需要2秒钟。 看来Postgres有某种caching。 我可以以某种方式看到caching是什么? 我可以强制清除所有caching以进行调整吗? 注意:我基本上在寻找postgres版本的下面的SQL Server命令: DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS 但是我也想知道如何看看缓冲区中实际包含的内容。 谢谢你的帮助。
我想为Atmel AVR微控制器编写一个C代码固件。 我将使用GCC进行编译。 另外,我想启用编译器优化( -Os或-O2 ),因为我没有理由不启用它们,并且它们可能会比手动编写汇编产生更好的汇编方式。 但是我想要一小段代码没有优化。 我想推迟一段时间的函数执行,因此我想写一个什么都不做的循环,只是浪费一些时间。 不需要精确,只需等待一段时间。 /* How to NOT optimize this, while optimizing other code? */ unsigned char i, j; j = 0; while(–j) { i = 0; while(–i); } 由于AVR中的内存访问速度要慢很多,所以我希望将i和j保存在CPU寄存器中。 更新:我刚刚从AVR Libc发现util / delay.h和util / delay_basic.h 。 虽然大多数时候使用这些函数可能是一个更好的主意,但这个问题仍然有效且有趣。
在C / C ++中,可以设置以下代码: double a, b, c; … c = (a + b) / 2; 这完全一样的事情: c = (a + b) * 0.5; 我想知道哪个更好用。 一个操作比另一个操作更快吗?
将NumPy数组随机分为训练和testing/validation数据集的好方法是什么? 类似于Matlab中的cvpartition或cvpartition函数。
Dictionary.add(key, value)和Dictionary[key] = value什么区别? 我注意到,当插入一个重复的键时,最后一个版本不会引发ArgumentException ,但有没有理由更喜欢第一个版本? 编辑 :有没有人有关于此的权威信息来源? 我试过MSDN,但它是一如既往的一个疯狂的追逐:(