C# 为什么C比Java和C慢得多+;在我的素数测试中
(听我说,我的问题之前有很多解释) 正如你们中的一些人可能知道的,在过去的几天里,我已经发布了一些关于C++性能的问题。作为一个java程序员,我想知道C++是值得专门研究的,或者java足够好的性能编程。 不管怎样,我决定写一个基本的(非有效算法)素数程序——不创建对象,看看3种语言在时间上的比较。我不会发布代码,只是因为代码在算法中完全相同(除了我在C++中使用int而不是boolean)。只有计时代码不同(这显然超出了算法) 总之,要计算前10000个素数并将其循环40次(以夸大速度差异),需要: 爪哇:190.5秒 C++:189秒 C#:242秒 要计算前100000个素数(一次运行),需要: 爪哇:591秒 C++:588秒 C#:771秒 那么我的问题是,为什么C#比其他2个要慢得多?我认为Java和C#会非常接近。下面是C#算法(我知道有更快的方法可以找到素数):C# 为什么C比Java和C慢得多+;在我的素数测试中,c#,java,c++,C#,Java,C++,(听我说,我的问题之前有很多解释) 正如你们中的一些人可能知道的,在过去的几天里,我已经发布了一些关于C++性能的问题。作为一个java程序员,我想知道C++是值得专门研究的,或者java足够好的性能编程。 不管怎样,我决定写一个基本的(非有效算法)素数程序——不创建对象,看看3种语言在时间上的比较。我不会发布代码,只是因为代码在算法中完全相同(除了我在C++中使用int而不是boolean)。只有计时代码不同(这显然超出了算法) 总之,要计算前10000个素数并将其循环40次(以夸大速度差异)
static void Main(字符串[]args)
{
int NumberOfPrimesToFind=100000;
int NumberOfRuns=1;
DateTime start=DateTime.Now;
对于(int k=0;k
C++
intmain()
{
int NumberOfPrimesToFind=100000;
int NumberOfRuns=1;
内部温度;
双dif;
开始、结束的时间;
时间(&开始);
对于(int k=0;k
爪哇:
publicstaticvoidmain(字符串[]args){
int NumberOfPrimesToFind=100000;
int NumberOfRuns=1;
长启动=System.currentTimeMillis();
对于(int k=0;k
关于C#:
首先,你应该用秒表代替日期时间。
Datetime对于代码计时不可靠
第二,您确定要在关闭VisualStudio的情况下以发布模式执行它吗?
如果visual studio已打开,或者您正在使用F5启动,JIT将不会优化代码
所以。。。使用秒表并关闭visual studio的所有实例。
您必须更改项目选项,您应该在顶部工具栏中有一个组合框,您可以在其中阅读“调试”,只需单击它并选择“发布”,或者右键单击您的项目、属性,然后将其更改为发布模式。然后,为了避免各种问题,关闭VisualStudio的所有实例并双击可执行文件启动
看
CTRL+F5不在发布模式下编译,它只在选定的编译模式下启动可执行文件,而不附加调试进程,因此如果它是在调试模式下编译的,它将在调试模式下启动编译的可执行文件,而不调试它
然后我建议您避免使用布尔变量,每个分支条件都会降低CPU的速度,您可以使用整数。这不仅适用于C#,而且适用于所有语言
static void Main()
{
常量int NumberOfPrimesToFind=100000;
常数int NumberOfRuns=1;
System.Diagnostic.Stopwatch sw=新的System.Diagnostic.Stopwatch();
sw.Start();
对于(int k=0;kstatic void Main(string[] args)
{
int NumberOfPrimesToFind = 100000;
int NumberOfRuns = 1;
DateTime start = DateTime.Now;
for (int k = 0; k < NumberOfRuns; k++)
{
FindPrimes(NumberOfPrimesToFind);
}
DateTime finish = DateTime.Now;
Console.Out.WriteLine(finish-start);
Console.In.Read();
}
static void FindPrimes(int NumberOfPrimesToFind)
{
int NumberOfPrimes = 0;
int CurrentPossible = 2;
Boolean IsPrime ;
while (NumberOfPrimes < NumberOfPrimesToFind)
{
IsPrime = true;
for (int j = 2; j < CurrentPossible; j++)
{
if (CurrentPossible % j == 0)
{
IsPrime = false;
break;
}
}
if (IsPrime)
{
NumberOfPrimes++;
}
CurrentPossible++;
}
}
int main()
{
int NumberOfPrimesToFind = 100000;
int NumberOfRuns = 1;
int temp;
double dif;
time_t start,end;
time (&start);
for (int k = 0; k < NumberOfRuns; k++)
{
FindPrimes(NumberOfPrimesToFind);
}
time (&end);
//Number of seconds
dif = difftime (end,start);
cout << (dif);
cin >> temp;
}
void FindPrimes(int NumberOfPrimesToFind)
{
int NumberOfPrimes = 0;
int CurrentPossible = 2;
int IsPrime ;
while (NumberOfPrimes < NumberOfPrimesToFind)
{
IsPrime = 1;
for (int j = 2; j < CurrentPossible; j++)
{
if (CurrentPossible % j == 0)
{
IsPrime = 0;
break;
}
}
if (IsPrime==1)
{
NumberOfPrimes++;
}
CurrentPossible++;
}
}
public static void main(String[] args) {
int NumberOfPrimesToFind = 100000;
int NumberOfRuns = 1;
long start = System.currentTimeMillis();
for (int k = 0; k < NumberOfRuns; k++)
{
FindPrimes(NumberOfPrimesToFind);
}
long finish = System.currentTimeMillis();
System.out.println((finish-start));
}
static void FindPrimes(int NumberOfPrimesToFind)
{
int NumberOfPrimes = 0;
int CurrentPossible = 2;
Boolean IsPrime ;
while (NumberOfPrimes < NumberOfPrimesToFind)
{
IsPrime = true;
for (int j = 2; j < CurrentPossible; j++)
{
if (CurrentPossible % j == 0)
{
IsPrime = false;
break;
}
}
if (IsPrime)
{
NumberOfPrimes++;
}
CurrentPossible++;
}
}
static void Main()
{
const int NumberOfPrimesToFind = 100000;
const int NumberOfRuns = 1;
System.Diagnostic.Stopwatch sw = new System.Diagnostic.Stopwatch();
sw.Start();
for (int k = 0; k < NumberOfRuns; k++)
{
FindPrimes(NumberOfPrimesToFind);
}
sw.Stop();
Console.WriteLine(sw.Elapsed.TotalMilliseconds);
Console.ReadLine();
}
static void FindPrimes(int NumberOfPrimesToFind)
{
int NumberOfPrimes = 0;
int CurrentPossible = 2;
while (NumberOfPrimes < NumberOfPrimesToFind)
{
int IsPrime = 1;
for (int j = 2; j < CurrentPossible; j++)
{
if (CurrentPossible % j == 0)
{
IsPrime = 0;
break;
}
}
NumberOfPrimes += IsPrime;
CurrentPossible++;
}
}
int FindPrimes(int NumberOfPrimesToFind)
{
int NumberOfPrimes = 0;
int CurrentPossible = 2;
while (NumberOfPrimes < NumberOfPrimesToFind)
{
int IsPrime = 1;
for (int j = 2; j < CurrentPossible; j++)
{
if (CurrentPossible % j == 0)
{
IsPrime = 0;
break;
}
}
NumberOfPrimes += IsPrime;
CurrentPossible++;
}
return NumberOfPrimes ;
}
public static void main(String... args) {
int numberOfPrimesToFind = 100000;
int numberOfRuns = 40;
long start = System.currentTimeMillis();
for (int k = 0; k < numberOfRuns; k++)
findPrimes(numberOfPrimesToFind);
long finish = System.currentTimeMillis() - start;
System.out.printf("Took %.2f seconds to loop %,d times%n", finish/1e3, numberOfRuns);
}
static void findPrimes(int numberOfPrimesToFind) {
int numberOfPrimes = 0;
int currentPossible = 2;
while (numberOfPrimes < numberOfPrimesToFind) {
boolean isPrime = isPrime(currentPossible);
if (isPrime) {
numberOfPrimes++;
}
currentPossible++;
}
}
private static boolean isPrime(int currentPossible) {
if ((currentPossible & 1) == 0) return false;
for (int j = 3; j * j <= currentPossible; j += 2)
if (currentPossible % j == 0)
return false;
return true;
}
Took 9.26 seconds to loop 40 times