Tag: 优化

在C / C ++中使用汇编语言

我记得在阅读某个地方真正优化和加快某些部分的代码,程序员用汇编语言编写该部分。 我的问题是 – 这个练习还在做吗? 以及如何做到这一点? 汇编语言不是写得太麻烦了吗? 当我们编译C代码(有或没有-O3标志)时,编译器会进行一些代码优化并链接所有库并将代码转换为二进制对象文件。 所以当我们运行程序时,它已经是最基本的forms,即二进制。 那么如何诱导“汇编语言”呢? 我想了解这个概念和任何帮助或链接非常感谢。 更新:按照dbemerlin的要求改写第3点 – 因为你可能能够编写比编译器生成的更有效的汇编代码,除非你是汇编专家,否则代码会慢慢运行,因为编译器通常比大多数人能更好地优化代码。

使用Django的ORM加速批量插入?

我计划使用django的ORM将大约750个文件(每个〜250MB)的十亿条logging上传到一个数据库。 目前每个文件需要20分钟的时间来处理,我想知道是否有任何方法来加速这个过程。 我采取了以下措施: 每使用@ transaction.commit_manually并提交一次,每5000条logging 设置DEBUG = False,这样django 就不会在内存中累积所有的sql命令 循环遍历单个文件中的logging完全包含在单个函数中(最小化堆栈更改) 从敲击查询数据库(使用已经在db中的对象的本地散列而不是使用get_or_create ) 在save()中设置force_insert = True,希望能够保存django的一些逻辑 显式设置id希望能够保存django的一些逻辑 通用代码最小化和优化 我还能做些什么来加快速度? 这是我的一些想法: 使用某种Python编译器或更快的版本(Psyco?) 重写ORM并直接使用SQL 使用一些可能更好的第三方代码( 1,2 ) 请求django社区创build一个bulk_insert函数 任何有关这些项目或任何其他想法的指针将受到欢迎:)

最快的代码C / C ++来select一组27个浮点值的中位数

这是众所周知的selectalgorithm。 请参阅http://en.wikipedia.org/wiki/Selection_algorithm 。 我需要它来find一组3×3×3体素值的中值。 由于体积是由十亿个体素组成,并且algorithm是recursion的,所以最好稍微快一点。 总体而言,可以预期的是价值相对接近。 迄今为止我已经试过的最快速的已知algorithm使用快速sorting分区function。 我想知道是否有更快的。 我已经“发明”了使用两堆的速度提高了20%,但是使用散列的速度更快。 在执行这个之前,我想知道是否已经有一个快速的解决scheme。 我使用浮点数的事实应该是无关紧要的,因为它们可以在反转符号位之后被认为是无符号整数。 订单将被保留。 编辑:基准和源代码转移到一个单独的答案,由戴维兰德曼build议。 请看下面的chmike的答案。 编辑 :到目前为止,最有效的algorithm是由Boojum引用作为快速中值和双边过滤纸,现在是这个问题的答案的链接。 这种方法的第一个聪明的想法是使用基数sorting,其次是结合中间search相邻像素谁共享很多像素。

ResultSet:按索引检索列值与按标签检索

在使用JDBC的时候,我经常碰到类似的构造 ResultSet rs = ps.executeQuery(); while (rs.next()) { int id = rs.getInt(1); // Some other actions } 我问自己(还有代码的作者)为什么不使用标签来检索列值: int id = rs.getInt("CUSTOMER_ID"); 我听到的最好的解释是有关性能。 但实际上,它是否使处理速度非常快? 我不这么认为,尽pipe我从来没有做过测量。 即使通过标签检索会慢一点,但是,在我看来,它提供了更好的可读性和灵活性。 那么有人可以给我一个很好的解释,避免检索列索引,而不是列标签? 这两种方法的优点和缺点是什么(也许,关于某些DBMS)?

由于索引,SQLite插入速度随着logging数量的增加而减慢

原来的问题 背景 众所周知,SQLite 需要进行微调,以达到50k插入/秒的插入速度。 这里有很多关于插入速度慢的问题和大量的build议和基准。 也有声称SQLite可以处理大量的数据 ,报告的50+ GB不会导致正确的设置任何问题。 我遵循这里和其他地方的build议,以达到这些速度,我很高兴35k-45k插入/秒。 我所遇到的问题是,所有的基准testing都只能certificate快速插入速度<1mlogging。 我所看到的是插入速度似乎与桌子大小成反比 。 问题 我的用例需要在[x_id, y_id, z_id]存储500m到1b元组( [x_id, y_id, z_id] )几年(1m行/天)。 值是1到2,000,000之间的所有整数ID。 z_id上有一个索引。 前10M行的性能是非常好的,大约35K插入/秒,但是当表具有~20m行时,性能开始受损。 我现在看到大约100个插入/秒。 桌子的大小不是特别大。 行20米,磁盘大小约500MB。 该项目是用Perl编写的。 题 这是在SQLite中的大表的现实,还是有任何秘密保持高行插入率> 10米行? 已知的解决方法,如果可能,我想避免 删除索引,添加logging,重新索引 :这是一个很好的解决方法,但在更新过程中数据库仍然需要使用时不起作用。 这将无法使数据库完全无法访问x分钟/天 把表分成更小的子表/文件 :这将在短期内工作,我已经尝试过了。 问题是,我需要能够从整个历史logging中检索数据,这意味着最终我将达到62个表附件的限制。 附加,在临时表中收集结果,每个请求分离数百次似乎是很多工作和开销,但是如果没有其他select,我会尝试。 设置 SQLITE_FCNTL_CHUNK_SIZE :我不知道C( SQLITE_FCNTL_CHUNK_SIZE ),所以我宁愿不学习它,只是为了完成这个。 我看不出用Perl设置这个参数的方法。 UPDATE 虽然SQLite声称它能够处理大型数据集,但是Tim还是build议索引导致插入时间越来越慢,我使用以下设置进行了基准比较: 插行: 1400万 提交批量大小: 50,000条logging cache_size编译指示: 10,000 page_size pragma: 4,096 […]

C#“是”运算符在.NET 4上的释放模式优化下受到影响吗?

下面是一个简单的testing夹具。 它在debugging版本中成功并在发布版本(VS2010,.NET4解决scheme,x64)中失败: [TestFixture] public sealed class Test { [Test] public void TestChecker() { var checker = new Checker(); Assert.That(checker.IsDateTime(DateTime.Now), Is.True); } } public class Checker { public bool IsDateTime(object o) { return o is DateTime; } } 看起来代码优化造成了一些破坏。 如果我在Release版本上禁用它,它也可以工作。 这令我感到困惑。 下面我使用ILDASM来反汇编这个版本的两个版本: debuggingIL: .method public hidebysig instance bool IsDateTime(object o) cil managed { // Code size […]

文件I / O与stream – 最佳的内存缓冲区大小

我正在写一个小的I / O库来协助一个更大的(爱好)项目。 该库的一部分对文件执行各种function,通过FileStream对象读取/写入。 在每个StreamReader.Read(…)传递中, 我发布了一个将在主应用中使用的事件来显示进度信息。 在循环中进行的处理是有效的,但不是太耗时(例如,它可能只是一个简单的文件副本,或者可能涉及encryption…)。 我的主要问题是:什么是最好的内存缓冲区大小使用? 考虑物理磁盘布局,我可以select2k,这将覆盖CD扇区大小,是512字节硬盘扇区的好几倍。 在抽象树的上方,你可以select一个更大的缓冲区,一次读取整个FAT簇。 我意识到今天的个人电脑,我可以去寻找更多的内存饥饿的选项(例如几个MiB),但是随后我增加了UI更新之间的时间,并且用户感觉到响应性较差的应用程序。 另外,我最终希望提供一个类似的FTP / HTTP服务器上的文件(通过本地networking/快速的DSL)的接口。 什么是最好的内存缓冲区大小(再次,感知响应性能与性能之间的“最佳情况”权衡)?

seq扫描和postgres中的位图堆扫描有什么区别?

在解释命令的输出中,我find了两个术语'Seq Scan'和'Bitmap heap Scan'。 有人能告诉我这两种扫描有什么区别? (我正在使用PostgreSql)

并行化:pthreads还是OpenMP?

科学计算中的大多数人在共享内存并行化方面使用OpenMP作为准标准。 有没有任何理由(除了可读性)通过pthreads使用OpenMP? 后者似乎更基本,我怀疑它可以更快,更容易优化。

C ++:优化成员variables的顺序?

当时我正在阅读一篇游戏编码器的博客文章 ,他正在忙着榨取每一个CPU的代码。 他提到的一个诀窍就是 “将一个类的成员variables重新sorting为最常用和最less使用” 我不熟悉C ++,也不熟悉它如何编译,但我想知道是否 这个说法是准确的? 如何/为什么? 它是否适用于其他(编译/脚本)语言? 我知道这个技巧所节省的(CPU)时间是很less的,这不是一个破坏交易的方法。 但另一方面,在大多数函数中,确定哪些variables将是最常用的,并且只是默认开始编码就很容易。