标签: c

与Project Euler的速度比较:C vs Python vs Erlang vs Haskell

我已经采取了问题#12项目欧拉作为编程练习和我的(肯定不是最优的)实现在C,Python和Erlang和Haskell的比较.为了获得更高的执行时间,我搜索第一个三角形数字,其中有超过1000个除数而不是原始问题中所述的500.

结果如下:

C:

lorenzo@enzo:~/erlang$ gcc -lm -o euler12.bin euler12.c
lorenzo@enzo:~/erlang$ time ./euler12.bin
842161320

real    0m11.074s
user    0m11.070s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

lorenzo@enzo:~/erlang$ time ./euler12.py 
842161320

real    1m16.632s
user    1m16.370s
sys 0m0.250s
Run Code Online (Sandbox Code Playgroud)

Python与PyPy:

lorenzo@enzo:~/Downloads/pypy-c-jit-43780-b590cf6de419-linux64/bin$ time ./pypy /home/lorenzo/erlang/euler12.py 
842161320

real    0m13.082s
user    0m13.050s
sys 0m0.020s
Run Code Online (Sandbox Code Playgroud)

二郎:

lorenzo@enzo:~/erlang$ erlc euler12.erl 
lorenzo@enzo:~/erlang$ time erl -s euler12 solve
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> 842161320

real    0m48.259s
user    0m48.070s
sys 0m0.020s
Run Code Online (Sandbox Code Playgroud)

哈斯克尔: …

c python erlang performance haskell

645
推荐指数
14
解决办法
13万
查看次数

为什么structof sizeof不等于每个成员的sizeof总和?

为什么sizeof操作员返回的结构尺寸大于结构成员的总尺寸?

c c++ struct c++-faq sizeof

644
推荐指数
11
解决办法
18万
查看次数

如何实现每个周期4个FLOP的理论最大值?

如何在现代x86-64 Intel CPU上实现每个周期4个浮点运算(双精度)的理论峰值性能?

据我所知,SSE 需要三个周期,addmul大多数现代Intel CPU需要五个周期才能完成(参见例如Agner Fog的"指令表").由于流水线操作,add如果算法具有至少三个独立的求和,则每个周期可以获得一个吞吐量.因为打包addpd和标量addsd版本都是如此,并且SSE寄存器可以包含两个,double每个周期的吞吐量可以高达两个触发器.

此外,似乎(虽然我没有看到任何适当的文档)add并且mul可以并行执行,给出每个周期四个触发器的理论最大吞吐量.

但是,我无法使用简单的C/C++程序复制该性能.我最好的尝试导致大约2.7个翻牌/周期.如果有人可以贡献一个简单的C/C++或汇编程序,它可以表现出非常高兴的峰值性能.

我的尝试:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/time.h>

double stoptime(void) {
   struct timeval t;
   gettimeofday(&t,NULL);
   return (double) t.tv_sec + t.tv_usec/1000000.0;
}

double addmul(double add, double mul, int ops){
   // Need to initialise differently otherwise compiler might optimise away
   double sum1=0.1, sum2=-0.1, sum3=0.2, sum4=-0.2, sum5=0.0;
   double mul1=1.0, mul2= 1.1, mul3=1.2, mul4= 1.3, …
Run Code Online (Sandbox Code Playgroud)

c c++ architecture optimization assembly

618
推荐指数
4
解决办法
7万
查看次数

如何检测无符号整数乘法溢出?

我在C++编写一个程序来找到所有的解决方案b = c ^,其中一个,bc ^一起使用所有的数字0-9只出现一次.该方案在循环值b,并且在每次跑了数字计数程序,b一个b以检查是否数字的条件感到满意.

然而,当可以产生伪解一个b溢出整数限制.我最终使用以下代码检查:

unsigned long b, c, c_test;
...
c_test=c*b;         // Possible overflow
if (c_test/b != c) {/* There has been an overflow*/}
else c=c_test;      // No overflow
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来测试溢出?我知道有些芯片有一个内部标志,当溢出发生时会设置,但我从未见过通过C或C++访问它.


请注意,在C和C++中,签名 int溢出是未定义的行为,因此您必须在不实际导致它的情况下检测它.有关添加前的signed int overflow,请参阅在C/C++中检测带符号的溢出

c c++ integer-overflow

593
推荐指数
19
解决办法
30万
查看次数

什么是C中的size_t?

size_t在C中感到困惑.我知道它是由sizeof运营商返回的.但究竟是什么呢?它是数据类型吗?

假设我有一个for循环:

for(i = 0; i < some_size; i++)
Run Code Online (Sandbox Code Playgroud)

我应该使用int i;size_t i;

c int size-t

590
推荐指数
10
解决办法
68万
查看次数

哪个更快:while(1)或while(2)?

这是一位高级经理提出的面试问题.

哪个更快?

while(1) {
    // Some code
}
Run Code Online (Sandbox Code Playgroud)

要么

while(2) {
    //Some code
}
Run Code Online (Sandbox Code Playgroud)

我说两者都有相同的执行速度,因为里面的表达式while应该最终评估为truefalse.在这种情况下,两者都评估,true并且条件内没有额外的条件指令while.因此,两者都具有相同的执行速度,而我更喜欢(1).

但采访者自信地说:"检查你的基础知识.while(1)比快while(2)." (他没有测试我的信心)

这是真的?

另请参阅:"for(;;)"是否比"while(TRUE)"快?如果没有,为什么人们会使用它?

c performance while-loop

582
推荐指数
15
解决办法
9万
查看次数

如何从进程内部确定CPU和内存消耗?

我曾经有过从正在运行的应用程序中确定以下性能参数的任务:

  • 可用的虚拟内存总量
  • 目前使用的虚拟内存
  • 我的进程当前使用的虚拟内存
  • 总RAM可用
  • RAM目前使用
  • RAM当前由我的进程使用
  • 目前使用的CPU%
  • 我的进程当前使用的CPU百分比

代码必须在Windows和Linux上运行.尽管这似乎是一项标准任务,但在手册(WIN32 API,GNU文档)以及Internet上查找必要的信息花了我好几天,因为关于这个主题的信息太多不完整/不正确/过时了发现了那里.

为了避免其他人遇到同样的麻烦,我认为收集所有分散的信息以及我在一个地方通过反复试验找到的信息是个好主意.

c c++ memory cpu

563
推荐指数
7
解决办法
29万
查看次数

如何在C中将函数作为参数传递?

我想创建一个函数来执行由一组数据上的参数传递的函数.如何在C中将函数作为参数传递?

c parameters syntax pointers function

559
推荐指数
6
解决办法
51万
查看次数

"static const"vs"#define"vs"enum"

在C中的以下陈述中哪一个更好用?

static const int var = 5;
Run Code Online (Sandbox Code Playgroud)

要么

#define var 5
Run Code Online (Sandbox Code Playgroud)

要么

enum { var = 5 };
Run Code Online (Sandbox Code Playgroud)

c constants

550
推荐指数
12
解决办法
33万
查看次数

为什么"while(!feof(file))"总是错的?

我看到人们最近在很多帖子中试图读取这样的文件.

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char **argv)
{
    char *path = argc > 1 ? argv[1] : "input.txt";

    FILE *fp = fopen(path, "r");
    if( fp == NULL ) {
        perror(path);
        return EXIT_FAILURE;
    }

    while( !feof(fp) ) {  /* THIS IS WRONG */
        /* Read and process data from file… */
    }
    if( fclose(fp) == 0 ) {
        return EXIT_SUCCESS;
    } else {
        perror(path);
        return EXIT_FAILURE;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个__CODE__循环有什么问题?

c file while-loop feof

550
推荐指数
4
解决办法
21万
查看次数