我想比较使用Python和C++从stdin读取字符串的读取行,并且看到我的C++代码运行速度比等效的Python代码慢一个数量级,这让我很震惊.由于我的C++生锈了,我还不是专家Pythonista,请告诉我,如果我做错了什么或者我是否误解了什么.
(TLDR回答:包括声明:cin.sync_with_stdio(false)
或者只是fgets
改用.
TLDR结果:一直向下滚动到我的问题的底部并查看表格.)
C++代码:
#include <iostream>
#include <time.h>
using namespace std;
int main() {
string input_line;
long line_count = 0;
time_t start = time(NULL);
int sec;
int lps;
while (cin) {
getline(cin, input_line);
if (!cin.eof())
line_count++;
};
sec = (int) time(NULL) - start;
cerr << "Read " << line_count << " lines in " << sec << " seconds.";
if (sec > 0) {
lps = line_count / sec;
cerr << " LPS: " << lps …
Run Code Online (Sandbox Code Playgroud) $ time foo
real 0m0.003s
user 0m0.000s
sys 0m0.004s
$
Run Code Online (Sandbox Code Playgroud)
"真实","用户"和"系统"在时间输出中意味着什么?
在对我的应用进行基准测试时哪一个有意义?
以下Java程序平均需要在0.50到0.55之间运行:
public static void main(String[] args) {
long startTime = System.nanoTime();
int n = 0;
for (int i = 0; i < 1000000000; i++) {
n += 2 * (i * i);
}
System.out.println((double) (System.nanoTime() - startTime) / 1000000000 + " s");
System.out.println("n = " + n);
}
Run Code Online (Sandbox Code Playgroud)
如果我更换2 * (i * i)
用2 * i * i
,它需要0.60〜0.65s之间运行.怎么会?
我运行了每个版本的程序15次,在两者之间交替.结果如下:
2*(i*i) | 2*i*i
----------+----------
0.5183738 | 0.6246434
0.5298337 | 0.6049722
0.5308647 | 0.6603363
0.5133458 | 0.6243328
0.5003011 | …
Run Code Online (Sandbox Code Playgroud) def main():
for i in xrange(10**8):
pass
main()
Run Code Online (Sandbox Code Playgroud)
Python中的这段代码运行(注意:时序是在Linux中的BASH中使用时间函数完成的.)
real 0m1.841s
user 0m1.828s
sys 0m0.012s
Run Code Online (Sandbox Code Playgroud)
但是,如果for循环没有放在函数中,
for i in xrange(10**8):
pass
Run Code Online (Sandbox Code Playgroud)
然后它会运行更长的时间:
real 0m4.543s
user 0m4.524s
sys 0m0.012s
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
或者它现在反过来了?
从我所听到的有些领域,C#证明比C++更快,但我从来没有勇气自己测试它.
你们中的任何一个人都可以详细解释这些差异,或者将我指向正确的地方以获取相关信息.
我目前正在使用GCC,但最近我发现了Clang而且我正在考虑切换.但是有一个决定性的因素 - 它产生的二进制文件的质量(速度,内存占用,可靠性) - 如果gcc -O3
能够生成运行速度快1%或内存减少1%的二进制文件,那么它就是一个交易破坏者.
Clang拥有比GCC更好的编译速度和更低的编译时内存占用,但我真的对基准测试/比较结果编译软件感兴趣 - 你能指点我一些或描述你的经历吗?
为了我自己的好奇心做一些负载测试,在我的服务器上运行:
ab -kc 50 -t 200 http://localhost/index.php
Run Code Online (Sandbox Code Playgroud)
这将打开50个保持活动连接200秒,然后使用index.php请求猛烈抨击我的服务器
在我的结果中,我得到:
Concurrency Level: 50
Time taken for tests: 200.007 seconds
Complete requests: 33106
Failed requests: 32951
(Connect: 0, Receive: 0, Length: 32951, Exceptions: 0)
Write errors: 0
Keep-Alive requests: 0
Total transferred: 1948268960 bytes
HTML transferred: 1938001392 bytes
Requests per second: 165.52 [#/sec] (mean)
Time per request: 302.071 [ms] (mean)
Time per request: 6.041 [ms] (mean, across all concurrent requests)
Transfer rate: 9512.69 [Kbytes/sec] received
Run Code Online (Sandbox Code Playgroud)
请注意32951"失败"请求.我无法弄清楚这一点.
在测试运行时,我能够完美地从家用计算机访问我的网站,尽管页面底部的页面加载时间报告为.5而不是通常的.02.但是我从来没有遇到过失败的请求.
那么为什么AB报告说有一半的连接失败了?"长度:"在这种情况下意味着什么?
谢谢
人们普遍提到Redis是"Blazing Fast",mongoDB也很快.但是,我很难找到比较两者结果的实际数字.鉴于类似的配置,功能和操作(并且可能显示因子如何随着不同的配置和操作而变化)等,Redis速度提高了10倍,速度提高了2倍,速度提高了5倍?
我只谈到性能.据我所知,mongoDB是一个不同的工具,具有更丰富的功能集.这不是"mongoDB 比Redis 更好 "的辩论.我问,Redis比mongoDB好多少?
在这一点上,即使是便宜的基准也比没有基准更好.
我有一个C程序,旨在在几个处理器上并行运行.我需要能够记录执行时间(可能是1秒到几分钟).我已经搜索了答案,但他们似乎都建议使用该clock()
函数,然后计算程序所用的时钟数除以该Clocks_per_second
值.
我不确定如何Clocks_per_second
计算价值?
在Java中,我只是在执行之前和之后以毫秒为单位.
C中有类似的东西吗?我看过了,但我似乎无法找到比第二种解决方案更好的方法.
我也知道分析器是一个选项,但我希望自己实现一个计时器.
谢谢
benchmarking ×10
performance ×3
c++ ×2
java ×2
python ×2
apachebench ×1
bytecode ×1
c ×1
c# ×1
clang ×1
cpython ×1
gcc ×1
getline ×1
iostream ×1
jit ×1
jvm ×1
jvm-hotspot ×1
load-testing ×1
mongodb ×1
optimization ×1
profiling ×1
redis ×1
time ×1
unix ×1