天道酬勤,学无止境

performance

Why does Sleep() slow down subsequent code for 40ms?

I originally asked about this at coderanch.com, so if you've tried to assist me there, thanks, and don't feel obliged to repeat the effort. coderanch.com is mostly a Java community, though, and this appears (after some research) to really be a Windows question, so my colleagues there and I thought this might be a more appropriate place to look for help. I have written a short program that either spins on the Windows performance counter until 33ms have passed, or else calls Sleep(33). The former exhibits no unexpected effects, but the latter appears to (inconsistently) slow subsequent

2021-06-21 12:09:21    分类:问答    c++   windows   performance   sleep

IRQ Coalesce 之前 NAPI 的优势是什么?(What are the advantages NAPI before the IRQ Coalesce?)

问题 众所周知,有两种方法可以避免高负载网络中硬件中断的一些开销,当硬件中断太多时,切换到它们会花费太多时间。 它对性能和程序风格的选择方法非常重要。 NAPI(新 API) -不使用硬件中断,每隔一段时间轮询以太网设备。 Linux 内核默认使用中断驱动模式,只有在传入数据包的流量超过某个阈值时才会切换到轮询模式。 http://en.wikipedia.org/wiki/New_API 内核可以在不被中断的情况下定期检查传入的网络数据包的到达,从而消除了中断处理的开销。 中断合并 -使用硬件中断,但如果发生中断,则禁用中断并开始轮询,一段时间后轮询终止并激活中断。 https://en.wikipedia.org/wiki/Interrupt_coalescing 一种技术,在该技术中,通常会触发硬件中断的事件被阻止,直到一定数量的工作未决或超时计时器触发。 这两种方法都没有显着的中断成本——这是默认中断驱动模式之前的优势。 但是第二种方法 -中断合并更合理,因为它: 更少的延迟- 一旦包到达,立即尝试处理它,立即中断发生或如果最近发生中断则轮询它。 相反的 NAPI 不会立即处理该帧,而是会等待一段时间以进行下一次轮询。 较少的 CPU 使用率- 仅当至少有一个数据包已经到来时才开始轮询。 但是不是徒劳地做轮询,即使帧没有收到,就好像它做了 NAPI。 IRQ

2021-06-21 12:02:57    分类:技术分享    linux   performance   linux-kernel   network-programming   interrupt

多语言 PHP 网站的最有效方法(Most efficient approach for multilingual PHP website)

问题 我正在开发一个大型多语言网站,我正在考虑使用不同的方法使其成为多语言网站。 我能想到的可能替代方案是: 生成 .po 文件的 Gettext 函数一个 MySQL 表,其中包含每个文本的翻译和唯一字符串 ID 带有数组的 PHP 文件包含具有唯一字符串 ID 的不同翻译 据我所知,Gettext 函数应该是最有效的,但我的要求是应该可以更改原始参考语言(英语)中的文本字符串,而该字符串的其他翻译不会自动恢复为英语,仅仅因为几个字变了。 这可以用 Gettext 实现吗? 资源要求最低的解决方案是什么? 使用带有数组的 Gettext 函数或 PHP 文件或多或少同样需要资源吗? 对于更有效的解决方案,还有其他建议吗? 回答1 几点考虑: 1. 翻译谁来做翻译? 也连接到该站点的人? 翻译公司? 使用 Gettext 时,您将使用“pot”(.po) 文件。 这些文件包含消息 ID 和消息字符串(翻译)。 例子: msgid "A string to be translated would go here" msgstr "" 现在,对于需要翻译它的人来说,这看起来很好并且可以理解。 但是当你使用关键字而不是完整的句子时会发生什么,就像迈克建议的那样? 如果有人需要翻译名为“address_home”的 msgid,他或她不知道这应该是标题“家庭地址”还是一个完整的句子。

2021-06-21 11:57:14    分类:技术分享    php   mysql   performance   multilingual   gettext

与 Java 6 相比,Java 8 的 GUI 性能较差(Java 8 poor GUI performance compared to Java 6)

问题 在 Java 6 下面的代码按预期运行,但在 Java 8 中需要更多时间。 有趣的部分是组件使用相同的方法setEnable()来启用和禁用组件,但是禁用调用比启用调用花费的时间长得多,几乎是启用调用的两倍。 在 Java 8 中禁用比在 Java 1.6 中花费的时间要长得多。 问题是为什么会发生这种情况? 这是 Java 8 的性能问题吗? 以下是 Java 6 的结果: Sun Microsystems Inc. 1.6.0_45 Initializing GUI GUI initialized in 1105 ms Disabling Disabled in 687 ms Enabling Enabled in 375 ms 以下是 Java 8 的结果: Oracle Corporation 1.8.0_25 Initializing GUI GUI initialized in 604 ms Disabling Disabled in 6341 ms Enabling Enabled in 370 ms 编码: import java.awt.Component; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import

2021-06-21 11:50:58    分类:技术分享    java   performance   swing   user-interface   java-8

Rewriting loops with apply functions

I have the 3 following functions which I would like to make faster, I assume apply functions are the best way to go, but I have never used apply functions, so I have no idea what to do. Any type of hints, ideas and code snippets will be much appreciated. n, T, dt are global parameters and par is a vector of parameters. Function 1: is a function to create an m+1,n matrix containing poisson distributed jumps with exponentially distributed jump sizes. My troubles here is because I have 3 loops and I am not sure how to incorporate the if statement in the inner loop. Also I have no idea if it is at

2021-06-21 11:49:37    分类:问答    r   for-loop   recursion   apply   performance

如何提高数据与二进制数据转换的 Dart 性能?(How to improve Dart performance of data conversion to/from binary?)

问题 为一家更大的德国公司 Future Technologies Group 做一些咨询工作 我已经将大约 6000 行 Java 服务器端软件移植到 Dart。 这应该有助于回答 Dart 是否可以在服务器上有效使用的问题。 (这本身就会为 Dart 开绿灯,因为它正在寻找一种语言进行客户端和服务器端编程的优势。) 学习 Dart(我真的很喜欢与它一起工作)让我期望相对于 Java 有 30-50% 的性能损失,但在任何情况下都不会低于 100%(慢两倍),这是上述决策过程的截止点以上。 港口顺利进行。 我学到了很多。 单元测试很好。 但结果证明性能非常糟糕……与 Java 程序相比,总体上慢了七倍。 分析代码揭示了两个主要罪魁祸首:数据转换和文件 I/O。 也许我做错了什么? 在我回到我的客户那里并且他们取消他们的 Dart 研究之前,我想搜索一些关于如何改进事情的建议。 让我们从数据转换开始,将原生 Dart 数据类型转换为各种可用于有效传输和存储数据的二进制格式。 通常这些转换很简单而且非常快,因为没有什么东西需要从使用的内部格式真正转换,但主要存储到缓冲区中。 我创建了一个基准程序,它以某种方式反映了我程序中这些转换的典型用法: import 'dart:typed_data'; import 'package:benchmark_harness/benchmark

2021-06-21 11:45:43    分类:技术分享    performance   dart   data-conversion

是否可以通过消除对 >= 比较的需要,将双关符号转换为无符号整数来加快边界检查?(Could type punning signed to unsigned integers make bounds checking faster by eliminating the need for >= comparison?)

问题 假设我的程序中有一个非常关键的性能循环,我需要检查一个点是否在矩形内,但我在编译时知道下限始终为 0,如下所示: (x >= 0 && y >= 0 && x < width && y < height) 我可以通过将 x 和 y 类型化为无符号整数来消除前两个比较吗(例如像reinterpret_cast<>()或 C++ 中的union ),因为符号位将保证任何负数都会变成unsigned int大到无法通过边界检查? 如果是这样,您将如何用 C++ 或其他语言实现它? 你能通过这样做获得任何性能改进吗? 回答1 是的,当您测试有符号整数并且下限为零时,这是一个完全有效的优化。 事实上,这是一个很常见的优化,你的编译器几乎肯定会自动完成; 通过自己做来混淆你的代码很可能是一种毫无意义的过早优化。 我刚刚在 GCC 4.9 上对此进行了测试,并通过检查生成的汇编代码确认它在-O1及更高版本上自动执行此优化。 我希望所有现代编译器都这样做。 回答2 也许... 虽然在“纸上”上,这似乎只允许您执行两次比较而不是四次比较(这很好) - 您不能保证这将如何执行。 如今,大多数 CPU 可以同时执行多个并行操作——并且您拥有的四个比较很容易并行计算。 您的问题取决于编译器、CPU 以及检查前后的代码 - 所以我的答案是“可能”。 避免将 x,y 转换为与当前大小不同的类型 - 即从

2021-06-21 11:43:10    分类:技术分享    c++   performance   int   integer-arithmetic   type-punning

Arrays.stream(array_name).sum() 比迭代方法慢吗?(Is Arrays.stream(array_name).sum() slower than iterative approach?)

问题 我正在编写 leetcode 问题:https://oj.leetcode.com/problems/gas-station/ 使用 Java 8。 当我使用Arrays.stream(integer_array).sum()计算总和时,我的解决方案得到了 TLE,而使用迭代计算数组中元素的总和时,相同的解决方案得到了接受。 这个问题的最佳时间复杂度是 O(n),我很惊讶在使用 Java 8 的流式 API 时得到 TLE。我只在 O(n) 中实现了解决方案。 import java.util.Arrays; public class GasStation { public int canCompleteCircuit(int[] gas, int[] cost) { int start = 0, i = 0, runningCost = 0, totalGas = 0, totalCost = 0; totalGas = Arrays.stream(gas).sum(); totalCost = Arrays.stream(cost).sum(); // for (int item : gas) totalGas += item; // for (int item : cost) totalCost += item; if (totalGas < totalCost)

2021-06-21 11:14:35    分类:技术分享    java   performance   algorithm   java-8

Python:为什么列表理解比 for 循环慢(Python: Why is list comprehension slower than for loop)

问题 本质上,这些是相同的函数——除了列表理解使用sum而不是x=0; x+= x=0; x+=因为不支持后者。 为什么列表理解编译速度慢 40%? #list comprehension def movingAverage(samples, n=3): return [float(sum(samples[i-j] for j in range(n)))/n for i in range(n-1, len(samples))] #regular def moving_average(samples, n=3): l =[] for i in range(n-1, len(samples)): x= 0 for j in range(n): x+= samples[i-j] l.append((float(x)/n)) return l 为了计时样本输入,我使用了[i*random.random() for i in range(x)] 回答1 您在列表推导式中使用了生成器表达式: sum(samples[i-j] for j in range(n)) 生成器表达式需要在每次运行时创建一个新框架,就像函数调用一样。 这是相对昂贵的。 您根本不需要使用生成器表达式; 您只需要对samples列表进行切片: sum(samples[i - n + 1:i + 1]) 您可以指定第二个参数

2021-06-21 11:08:43    分类:技术分享    python   performance   list-comprehension

vm.dirty_ratio 和 vm.dirty_background_ratio 的区别?(Difference between vm.dirty_ratio and vm.dirty_background_ratio?)

问题 我目前正在试验/proc/sys/vm的内核参数,尤其是dirty_ratio和dirty_background_ratio 。 内核文档对两者都有以下解释: 脏背景比包含,作为包含空闲页面和可回收页面的总可用内存的百分比,后台内核刷新线程将开始写出脏数据的页面数。 和 脏比率包含(作为包含空闲页和可回收页的总可用内存的百分比)的页数,在该页数中,正在生成磁盘写入的进程本身将开始写出脏数据。 在我的 linux 系统上, dirty_background_ratio为 10, dirty_ratio为 20。我明白区别在于,脏数据写给谁。 因此,如果我使用的内存达到 10%,内核开始回写,并且永远不会达到 20%。 我现在的问题是: dirty_background_ratio和dirty_ratio的较高值是否有任何意义,还是只是“较低的值是什么以及谁拥有它”的问题? 回答1 dirty_background_ratio 和dirty_ratio 的较高值是否有任何意义,还是只是“什么是较低值以及谁拥有它”的问题? 用更简单的话来说: vm.dirty_background_ratio是系统内存的百分比,当脏时系统可以开始将数据写入磁盘。 vm.dirty_ratio是系统内存的百分比,当脏时,执行写入的进程会阻塞并将脏页写入磁盘。 此可调参数取决于您的系统运行情况

2021-06-21 11:07:18    分类:技术分享    linux   performance   linux-kernel