这个是时间变成了1/2?
其实用不着太着急上硬件优化,一个程序可以优化的地方非常多,这也是为什么大家不再看重c++比c#快的那一点点的因素。
老鱼那个版本写的不好看,最后优化的也就万分之三。这不是一个有意义的优化度。
即使上硬件优化的话也最好一次到位,gpu或fpga的,中间的太尴尬
给你个新算法,时间是你原版的1/8的样子。而且还可以进一步做并行优化。只是我懒得搞了,c#版本不做任何优化已经够快了。
| Method | Mean | Error | StdDev | Ratio |
|---------- |-----------:|--------:|---------:|------:|
| intperf | 3,478.1 ms | 0.46 ms | 0.39 ms | 1.00 |
| | | | | |
| intperf3 | 652.8 ms | 6.36 ms | 5.63 ms | 1.00 |
| | | | | |
| intperf32 | 466.2 ms | 9.17 ms | 16.76 ms | 1.00 |
// * Legends *
Mean : Arithmetic mean of all measurements
Error : Half of 99.9% confidence interval
StdDev : Standard deviation of all measurements
Ratio : Mean of the ratio distribution ([Current]/[Baseline])
1 ms : 1 Millisecond (0.001 sec)
[Benchmark]
public int intperf3()
{
var notprime = new byte[n];
notprime[0] = 1;
notprime[1] = 1;
var t = n / 2;
for (int i = 2; i <= t; i++)
{
if (notprime[i]==0)
{
for (int j = i + i; j < n; j += i)
{
notprime[j] = 1;
}
}
}
return n-notprime.Sum(x=>x);
}
[Benchmark]
public void intperf32()
{
var notprime = new byte[n];
notprime[0] = 1;
notprime[1] = 1;
var t = n / 2;
for (int i = 2; i <= t; i++)
{
if (notprime[i] == 0)
{
for (int j = i + i; j < n; j += i)
{
notprime[j] = 1;
}
}
}
}
【 在 finlab 的大作中提到: 】
: 我的cpu支持到avx2, 没有整数除法。但是Intel提供了svml,可以高效模拟除法和取模运算。
: 我试着用svml优化了C++,这次时间缩短到3.67秒。
: simd还是明显提高了速度。 不过估计整数除法是模拟的,提高远没有8倍那么多。
: ...................
--
修改:leadu FROM 123.116.198.*
FROM 123.116.198.*