Tag: 表现

与C的Fibonacci序列相比,为什么Haskell这么慢?

我只是Haskell的初学者。 我编写了一个代码来显示Fibonacci序列中的N个数字。 这是我在Haskell中的代码, fib_seq 1 = 1:[] fib_seq 2 = 1:1:[] fib_seq n = sum(take 2 (fib_seq (n-1))):fib_seq (n-1) 当我在GHCI中为更高的数字运行此代码(例如fib_seq 40时,需要很长时间来评估它并且我的计算机挂起并且我必须中断。 但是,当我在C中写出相同的逻辑时,(我只是打印而不是将其保存在列表中), #include int fib_seq (int n){ if(n==1) return 1; else if(n==2) return 1; else return fib_seq(n-1)+fib_seq(n-2); } void print_fib(int n){ if(n==0) return; else printf(“%i “, fib_seq(n)); print_fib(n-1); } int main(int argn, char* argc){ print_fib(40); […]

计算c中的数字因子时ac程序的时间限制

我正在解决关于阶乘计算的问题,挑战如下! You are asked to calculate factorials of some small positive integers. Input An integer t, 1<=t<=100, denoting the number of testcases, followed by t lines, each containing a single integer n, 1<=n<=100. Output For each integer n given at input, display a line with the value of n! 我的代码给了我正确的解决方案,但超过了时间限制,即2秒: 代码如下: #include #include #include void […]

计算欧氏距离的最快方法

我需要以最快的方式计算两点之间的欧氏距离。 在C. 我的代码是这样的,看起来有点慢: float distance(int py, int px, int jy, int jx){ return sqrtf((float)((px)*(px)+(py)*(py))); } 提前致谢。 编辑: 对不起,我不清楚。 我最好指定上下文:我正在使用图像,我需要从每个像素到所有其他像素的欧几里德距离。 所以我必须计算很多次。 我不能使用距离的平方。 我将添加更多代码以便更清楚: for (jy=0; jy<sizeY; jy++) { for (jx=0; jx<sizeX; jx++) { if (jx==px && jy==py) { ; } else{ num+=rfun(imgI[py][px].red-imgI[jy][jx].red)/distance(py, px, jy, jx); den+=RMAX/distance(py, px, jy, jx); } } } float distance(int py, int […]

为什么使用带有int64_t操作数的mod使这个函数慢150%?

max_rem函数计算(a+1)^n + (a-1)^n在除以a²时离开的最大余数, n = 1, 2, 3… main调用max_rem每个从3到999 。 完整代码: #include #include int max_rem(int a) { int max_r = 0; int m = a * a; // <——– offending line int r1 = a+1, r2 = a-1; for(int n = 1; n <= a*a; n++) { r1 = (r1 * (a + 1)) % […]

将每秒字节快速复制到新存储区

我需要一种快速的方法将每个第二个字节复制到一个新的malloc内存区域。 我有一个RGB数据和每通道16位(48位)的原始图像,并希望创建一个每通道8位(24位)的RGB图像。 有没有比按字节复制更快的方法? 我对SSE2了解不多,但我想SSE / SSE2是可能的。

计算Go中切片中字符的出现次数

好的,所以我碰到了一堵砖墙。 编辑:在我的count()函数中使用bytes.IndexByte()使其运行速度几乎快两倍。 bytes.IndexByte()是用汇编而不是Go编写的。 仍然不是C速度,但更接近。 我有两个程序,一个在C中,一个在Go中,它们都计算文件中的换行符。 超级简单。 C程序运行~1.5秒,在2.4GB文件中运行~4.25秒。 我是否达到了Go的限速? 如果是这样, 究竟是什么造成了这种情况呢? 我可以阅读C,但我无法读取汇编,所以比较C的asm和Go的asm对我没什么用,除了表明Go还有400多行(忽略.ascii部分)。 虽然我知道Go无法匹配C步骤,但我不会假设4x减速。 想法? 这是Go的cpuprofile: 这是C(编译w / gcc -Wall -pedantic -O9 ) #include #include #include #include #include #include #include #include #define BUFFER_SIZE (16 * 1024) int main() { const char *file = “big.txt”; int fd = open (file, O_RDONLY); char buf[BUFFER_SIZE + 1]; uintmax_t bytes; size_t […]

如果在C中为null,检查海量数据的最快方法是什么?

我有大量的数据,可能是4MB。 现在想检查它中的所有位是否为0。 例如:这是数据: void* data = malloc(4*1024*1024); memset(data, 0, 4*1024*1024); 检查它中的所有位是否为0.这是我的解决方案不够快: int dataisnull(char* data, int length) { int i = 0; while(i<length){ if (data[i]) return 0; i++; } return 1; } 此代码可能有一些改进性能的方法。 例如,在32/64位机器中,一次检查4/8字节可能更快。 所以我想知道最快的方法是什么?

哪个循环有更好的性能? 增加还是减少?

可能重复: 倒计时比倒数更快吗? 哪个循环有更好的性能? 我从一些地方学到了第二个更好的地方。 但想知道原因。 for(int i=0;i=0;i–) { /*This is better ?*/ }

AVX / SSE版xorshift128 +

我正在努力制作最快的高质量RNG。 阅读http://xorshift.di.unimi.it/,xorshift128 +似乎是一个不错的选择。 C代码是 #include uint64_t s[ 2 ]; uint64_t next(void) { uint64_t s1 = s[ 0 ]; const uint64_t s0 = s[ 1 ]; s[ 0 ] = s0; s1 ^= s1 <> 17 ) ^ ( s0 >> 26 ) ) ) + s0; // b, c } 我不是SSE / AVX专家,但我的CPU支持SSE4.1 / SSE4.2 […]

为什么cgo的性能如此之慢? 我的测试代码有问题吗?

我正在做一个测试:比较cgo和纯Go函数的执行时间各自运行1亿次。 与Golang函数相比,cgo函数需要更长的时间,我对此结果感到困惑。 我的测试代码是: package main import ( “fmt” “time” ) /* #include #include #include void show() { } */ // #cgo LDFLAGS: -lstdc++ import “C” //import “fmt” func show() { } func main() { now := time.Now() for i := 0; i < 100000000; i = i + 1 { C.show() } end_time := time.Now() […]