把代码贴上来都觉得不好意思,因为我的代码写的并不好~``但是我觉得代码是否效率高和两个语言的比较并无啥关系:)毕竟是比较两语言运行这代码的速度,而代码写的好不好是另外一回事:)c#/////////////////////////////////////////////////////////////////////using System;namespace ConsoleApplication1 { /// <summary> /// Class1 的摘要说明。 /// </summary> class Class1 { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) { System.DateTime mydata2,mydata1; Console.Write("请输入查找个数:"); int nnn=Convert.ToInt32(Console.ReadLine()); mydata1=System.DateTime.Now; int x=0; int ii=0; bool mybool; double sum=0; int g=System.Convert.ToInt32(System.Math.Sqrt(nnn)+1); for (int i=2;i<=nnn;i++) { mybool=true; for(ii=2;ii<g;ii++) {
if(i % ii==0) { mybool=false; sum++; break; } } if(mybool) { System.Console.Write(i.ToString()+","); x++; } } mydata2=System.DateTime.Now; Console.WriteLine("\n\n\n找到个数:"+x.ToString()+" 运算次数:"+sum.ToString()); Console.WriteLine("\n运行时间:"+(mydata2-mydata1)+" 查找个数:"+nnn.ToString()); Console.WriteLine("\n"+mydata1.ToString()+" -- "+mydata2.ToString()); Console.ReadLine(); } } } java/////////////////////////////////////////////////////////////// import java.util.Date; public class T { public T() { } public static void main(String[] args) { T t = new T(); Date d1, d2; d1 = new Date(); int x = 0; double sum = 0; double mm = 1000000000; int g = (int) Math.sqrt(mm) + 1; int i, ii; boolean b = true; for (i = 2; i <= mm; i++) { b = true; for (ii = 2; ii < g; ii++) { if (i % ii == 0) { b = false; sum++; break; } } if (b) { System.out.print(i + ","); x++; } } d2 = new Date(); System.out.println(); System.out.println("找到个数:"+x+" 运算次数:"+sum); System.out.println(d1 + " -- " + d2); } }
呵呵,据权威的测试,以java编写的计算方面的程序已经速度与C/C++没有什么差别了,而在I/O方面差距较大。
=================
真的吗????
我觉得这种速度已经非常慢了,四十多分钟啊,我做测试的机器CPU是1G的~````
由此可见,讲效率,用汇编吧,[原来你的电脑可以更快的]
还有不要老是什么“汇编”的挂着,我比较JAVA和C#关汇编什么事?机器码比汇编还快呢~~``不过有趣的是,C#程序和JAVA程序同时运行时,系统大量的资源都给了C#,这点到是JAVA非常吃亏哦?我也不知道为什么~``
这位同学的算法在Python下找10000000以内所有素数,并且逐行输出,都不要你那么长时间。而且这个算法稍稍改正一下,验证一个数的时候,不要去遍历所有已知素数,只要遍历到小于当前所求数的平方根的素数即可(这是Eratosthenes筛法,不知道中文怎么翻译)。这样一改的话,还可以快无数倍,不知道你是怎么算的。
--------------------
内存的不断存取,难道不影响速度?内存又不是占着不动,要存取的嘛!
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
System.DateTime mydata2,mydata1;
Console.Write("请输入查找个数:");
int nnn=Convert.ToInt32(Console.ReadLine());
mydata1=System.DateTime.Now;
int x=0;
int ii=0;
bool mybool;
double sum=0;
int g=System.Convert.ToInt32(System.Math.Sqrt(nnn)+1);
for (int i=2;i<=nnn;i++)
{
mybool=true;
for(ii=2;ii<g;ii++)
{
if(i % ii==0)
{
mybool=false;
sum++;
break;
}
}
if(mybool)
{
System.Console.Write(i.ToString()+",");
x++;
} }
mydata2=System.DateTime.Now;
Console.WriteLine("\n\n\n找到个数:"+x.ToString()+" 运算次数:"+sum.ToString());
Console.WriteLine("\n运行时间:"+(mydata2-mydata1)+" 查找个数:"+nnn.ToString());
Console.WriteLine("\n"+mydata1.ToString()+" -- "+mydata2.ToString());
Console.ReadLine(); }
}
}
java///////////////////////////////////////////////////////////////
import java.util.Date;
public class T {
public T() { } public static void main(String[] args) {
T t = new T();
Date d1, d2;
d1 = new Date();
int x = 0;
double sum = 0;
double mm = 1000000000;
int g = (int) Math.sqrt(mm) + 1;
int i, ii;
boolean b = true;
for (i = 2; i <= mm; i++) {
b = true;
for (ii = 2; ii < g; ii++) {
if (i % ii == 0) {
b = false;
sum++;
break;
} }
if (b) {
System.out.print(i + ",");
x++;
}
}
d2 = new Date();
System.out.println();
System.out.println("找到个数:"+x+" 运算次数:"+sum);
System.out.println(d1 + " -- " + d2);
}
}
第一个循环:步长不应该是i++,因为大于2的偶数都是合数嘛,有什么好算的,步长改为+2。
第二个循环:g应该是i的平方根,而不应该是nnn的平方根。而且这个循环中ii应该遍历所有已经求出来的素数,而不应该是ii++这样去遍历。我估计算1亿的话应该在5分钟左右,我用python算也就花了10分钟。
楼主可以改改,然后告诉大家结果。尽量用最简单的数据结构和最简单的方法。不要输出,算完就给个提示,C#和JAVA输出机制的不同也会影响结果。尽量不要让循环体内出现C#或Java独有的方法。
我层用过C#写SQL往数据库插记录,结果花了我很久才插了几百万条,最后放弃了。科学计算主要是机器的快慢,跟具体的语言关系不是特别大
--------------------------------------------------------
大哥:这个也不是和C#关系很大吧?而应该是和Sql server关系比较大(同硬件).一般批量插入用事务也更快些.