procedure TForm1.Button1Click(Sender: TObject);
var
aq:TADODataSet;
i,j:DWORD;
begin
aq:=TADODataSet.Create(nil);
aq.Connection:= ADOConnection1;
aq.Active:=false;
aq.CommandText:='select * from xt_UserLogs';
i:= GetTickCount;
aq.Active:=true;
j:= GetTickCount;
showmessage(inttostr(j-i));end;
//-------------------------------
import java.sql.*;
public class TestDB {
public static void main(String[] args){
long iStart,iEnd;
String userName = "sa";
String userPwd = "9588";
Connection dbConn;
try{
String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
String dbURL = "jdbc:microsoft:sqlserver://192.168.12.8:1433; DatabaseName=SYSDA";
Class.forName(driverName);
dbConn = DriverManager.getConnection(dbURL, userName, userPwd);
Statement stmt=dbConn.createStatement();
String sql="SELECT * FROM xt_UserLogs";
iStart = System.currentTimeMillis();
ResultSet rs=stmt.executeQuery(sql);
System.out.println(System.currentTimeMillis()-iStart);
rs.close();
stmt.close();
dbConn.close();
}catch(SQLException sqle){
System.out.println("can't connection db:"+sqle);
} catch (Exception e) {
e.printStackTrace();
}
}
}*******************************
JAVA测出来是 47毫秒左右 DELPHI居然要4800毫秒
也差太多了吧 100倍。 是不是我的测试代码有误啊 要是正确的话 。。连JAVA的速度都不如???
虽然是MS的 ADO。。可是也太说不过去了吧~~~~~~~~ (难怪人家BS咱们用D的)
var
aq:TADODataSet;
i,j:DWORD;
begin
aq:=TADODataSet.Create(nil);
aq.Connection:= ADOConnection1;
aq.Active:=false;
aq.CommandText:='select * from xt_UserLogs';
i:= GetTickCount;
aq.Active:=true;
j:= GetTickCount;
showmessage(inttostr(j-i));end;
//-------------------------------
import java.sql.*;
public class TestDB {
public static void main(String[] args){
long iStart,iEnd;
String userName = "sa";
String userPwd = "9588";
Connection dbConn;
try{
String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
String dbURL = "jdbc:microsoft:sqlserver://192.168.12.8:1433; DatabaseName=SYSDA";
Class.forName(driverName);
dbConn = DriverManager.getConnection(dbURL, userName, userPwd);
Statement stmt=dbConn.createStatement();
String sql="SELECT * FROM xt_UserLogs";
iStart = System.currentTimeMillis();
ResultSet rs=stmt.executeQuery(sql);
System.out.println(System.currentTimeMillis()-iStart);
rs.close();
stmt.close();
dbConn.close();
}catch(SQLException sqle){
System.out.println("can't connection db:"+sqle);
} catch (Exception e) {
e.printStackTrace();
}
}
}*******************************
JAVA测出来是 47毫秒左右 DELPHI居然要4800毫秒
也差太多了吧 100倍。 是不是我的测试代码有误啊 要是正确的话 。。连JAVA的速度都不如???
虽然是MS的 ADO。。可是也太说不过去了吧~~~~~~~~ (难怪人家BS咱们用D的)
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[UserName] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ComputerName] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[ModuleID] [int] NULL ,
[IpAddress] [varchar] (15) COLLATE Chinese_PRC_CI_AS NULL ,
[LoginTime] [datetime] NULL ,
[State] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
CONSTRAINT [PK_USERLOGS] PRIMARY KEY CLUSTERED
(
[ID]
) WITH FILLFACTOR = 90 ON [PRIMARY]
) ON [PRIMARY]
GO
那个经过多层包装的控件 中间不知道走了多少弯路
你写一个没有界面的delphi程序。直接执行查询试试
个人意见。我回去试试。
aq.Active:=true;
j:= GetTickCount;
都这样了 还要怎么精简啊 已经没有其他任何东西干扰了
不能吧 那DELPHI优势呢?
帖中Delphi代码打印的时间包括连接的时间
而Java代码中没有包括连接的时间
>>JAVA测出来是 47毫秒左右
>>查询分析器要6秒你确信JAVA把266638条数据都取到本地了?
执行完后就是:
while(rs.next())
{
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));
}
不放在本地?难道他还一条一条到服务器上取??应该不会这么弱吧~~
因为java在 DriverManager.getConnection(dbURL, userName, userPwd); 时, 已经把连接打开了. 所以, 你实际测试的是: Delphi中, 打开连接并执行查询的速度, JAVA中, 执行查义的速度.
在java中, 你可以: rs.afterLast(); //将游标移动到最后...
试一下看.
^^^^^^^^^^^这儿是楼上错了, 不是楼主错哈.查询分析器是把所有数据Fetch过来后(而且还要显示到Grid中)的时间.同样做为比较, 你可以把Delphi中, 让AdoQuery.Last; //取得所有数据.
在java中, 你可以: rs.afterLast(); //将游标移动到最后...
试一下看.
相当于Delphi中的单向数据集. ---单向更快.而Delphi的AdoQuery(or AdoDataSet)是双向的.
另外极度建议把那个adoconnecion1的Connected变成true之后,在测试一下!!
WINDOWS的取时间的API:GetTickCountpublic class SpeedTest {
public static void main(String[] args) {
long i,j,x,z;
double y,tmp1;
i=System.currentTimeMillis();
String str;
for(z=0; z<3; z++)
{
for (x = 0; x < 10000000 ; x++)
{
str="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$%^&*()_+";
}
for(y = 0.0; y <10000000.0 ; y++)
{
tmp1 = y/3.1415926;
}
}
j = System.currentTimeMillis();
System.out.println(j-i);
}
}
你前面搞了个歪曲的测试,Delphi的计时包括连接数据库的时间,Java的不包括。
被人指出来了,你也不道个歉,反而继续玩这种小把戏。你看看你那个“测试”,
Java的String是不可变字符串,赋值不过是简单的串变量(本质是指针)copy。
而Delphi的string是可变的、带引用计数的,每次赋值的时候要检查引用计数,调用UniqueString,当然会慢一些。
两者并不是等价的。
真正等价的测试有两种方法:
1. 在Delphi程序中用PChar代替string;
2. 在Java程序中用StringBuffer代替String。你再比较一下哪个更快?
Delphi程序应该有两倍以上的速度优势。:)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
long sum=0,upperlim=1;
void test(long row, long ld, long rd){
if (row != upperlim){
long pos = upperlim & ~(row | ld | rd);
while (pos){
long p = pos& -pos;
pos -= p;
test(row+p, (ld+p)<<1, (rd+p)>>1);
}}
else
sum++;
} int main(int argc, char *argv[])
{
time_t tm;
int n=8;
if(argc!=1)n=atoi(argv[1]);
tm=time(0);
if((n<1)||(n>32)){
printf(" heh..I can't calculate that.\n");
exit(-1);}
printf("%d Queens\n",n);
upperlim=(upperlim<<n)-1;
test(0,0,0);
printf("Number of solutions is %ld, %d seconds\n", sum,(int)(time(0)-tm));
}
---------------------------
public class Queen
{
static int sum = 0, upperlim = 1; private static void test(int row, int ld, int rd)
{ if (row != upperlim) {
int pos = upperlim & ~(row | ld | rd);
while (pos != 0) {
int p = pos & -pos;
pos -= p;
test(row + p, (ld + p) << 1, (rd + p) >> 1);
}
}
else
sum++;
} public static void main(String[] args)
{
int n = 8; if (args.length == 1)
n = Integer.parseInt(args[0]); long tm = System.currentTimeMillis();
if ((n < 1) || (n > 32)) {
System.out.println(" heh..I can't calculate that.");
System.exit(-1);
}
System.out.println(n + " Queens");
upperlim = (upperlim << n) - 1; test(0, 0, 0);
System.out.println("Number of solutions is " + sum + ", " + (System.currentTimeMillis() - tm) + " milliseconds");
}
}
---------------------------------------------------------------------
在我机子上C是21秒 JDK6是 24秒
谁有兴趣写的DELPHI的看要多少时间
program q8;
uses SysUtils, Windows;
var
sum: longint = 0;
upperlim: longint = 1; n: integer = 8;
tm: cardinal;procedure test(row, ld, rd: longint);
var
pos, p: longint;
begin
if (row <> upperlim) then
begin
pos := upperlim and not (row or ld or rd);
while pos <> 0 do
begin
p := pos and (-pos);
pos := pos - p;
test(row + p, (ld + p) shl 1, (rd + p) shr 1);
end;
end
else
Inc(sum);
end;{ main }
begin
if ParamCount > 0 then
n := StrToInt(ParamStr(1));
tm := GetTickCount;
if (n < 1) or (n > 32) then
begin
writeln(' heh..I can''t calculate that.');
exit;
end;
writeln(Format('%d Queens', [n]));
upperlim:= upperlim shl n - 1;
test(0, 0, 0);
writeln(Format('Number of solutions is %d, %d seconds', [sum, GetTickCount - tm]));
end.
楼主不会delphi
白痴会吃饭
所以,楼主不如白痴
),你这样写速度肯定是很慢,如果把游标设为服务器端再看看(ADOQuery1.CursorLocation := clUseServer;).
这个是基本常识哦!
用VB连接本地数据库
用delphi连接远程数据库
然后两者比较效率...
结果不说了
JAVA是 JDBC直接驱动.并不是在ODBC之上又包装一层 好吧?
DELPHI 用 DEB速度最快. 你用ADO只能说明你无知
LZ确实扭曲了D的真实面目
不管什么样,谁能让你吃饱肚子,睡好觉觉 你就去学吧
盲目的比较没有任何的意义~~
没想到呢,Delphi板还真有那么几个不务正业的程序员,懂了那么一点点Java,使得楼主的伟大计划不能实现。
罪过啊罪过。