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的)

解决方案 »

  1.   

    xt_UserLogs有266638条数据 结构:CREATE TABLE [xt_UserLogs] (
    [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
      

  2.   

    我觉得你这样测试不公平
    那个经过多层包装的控件 中间不知道走了多少弯路
    你写一个没有界面的delphi程序。直接执行查询试试
    个人意见。我回去试试。
      

  3.   

    i:= GetTickCount;
      aq.Active:=true;
      j:= GetTickCount;
    都这样了  还要怎么精简啊  已经没有其他任何东西干扰了
      

  4.   

    一样的  最终都是调ADODATASET的
      

  5.   

    这个怎么讲呢,因为Delphi中你单纯就执行这一个还包括了打开数据库连接的时间但是时间差别这么大估计不可能你到 查询分析器里 执行看多长时间,这个最接近真实的时间。和这个有较大偏差才是开发工具的问题
      

  6.   

    写法不公平楼主,是做JAVA的?
      

  7.   

    查询分析器要6秒   我是支持D的 正在学JAVA
      

  8.   

    查询分析器要6秒 JAVA测出来是 47毫秒左右  DELPHI居然要4800毫秒楼主..醒醒
      

  9.   

    建议ADOConnection1先Connected之后再测试
      

  10.   

    要是把iStart = System.currentTimeMillis();放在TRY之后,也跟DELPHI差不多  
    不能吧   那DELPHI优势呢?
      

  11.   

    第一次与数据库连接是需要花较多时间的
    帖中Delphi代码打印的时间包括连接的时间
    而Java代码中没有包括连接的时间
      

  12.   

    >>xt_UserLogs有266638条数据
    >>JAVA测出来是 47毫秒左右
    >>查询分析器要6秒你确信JAVA把266638条数据都取到本地了?
      

  13.   

    ResultSet rs=stmt.executeQuery(sql);
    执行完后就是:
    while(rs.next())
    {
    System.out.println(rs.getString(1));
    System.out.println(rs.getString(2));
    System.out.println(rs.getString(3));
    }
      不放在本地?难道他还一条一条到服务器上取??应该不会这么弱吧~~
      

  14.   

    楼主错了. 你应该先把Delphi中的AdoConnection1打开....
    因为java在 DriverManager.getConnection(dbURL, userName, userPwd); 时, 已经把连接打开了. 所以, 你实际测试的是: Delphi中, 打开连接并执行查询的速度, JAVA中, 执行查义的速度.
      

  15.   

    楼主又错了...查询分析器是把所有数据Fetch过来后(而且还要显示到Grid中)的时间. 同样做为比较, 你可以把Delphi中, 让AdoQuery.Last; //取得所有数据.
    在java中, 你可以: rs.afterLast(); //将游标移动到最后...
    试一下看.
      

  16.   

    楼主又错了...
    ^^^^^^^^^^^这儿是楼上错了, 不是楼主错哈.查询分析器是把所有数据Fetch过来后(而且还要显示到Grid中)的时间.同样做为比较, 你可以把Delphi中, 让AdoQuery.Last; //取得所有数据.
    在java中, 你可以: rs.afterLast(); //将游标移动到最后...
    试一下看.
      

  17.   

    还有一点要提示大家: java中createStatement()不给参数的情况下,是使用ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY.
    相当于Delphi中的单向数据集. ---单向更快.而Delphi的AdoQuery(or AdoDataSet)是双向的.
      

  18.   

    查询分析器要6秒JAVA测出来是 47毫秒左右 DELPHI居然要4800毫秒难道微软东西,就是那么烂,效率那么差
    另外极度建议把那个adoconnecion1的Connected变成true之后,在测试一下!!
      

  19.   

    有JAVA的可以试一试下面这段代码  然后把他改成DELPHI的  看看效率如何  
    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);

    }
    }
      

  20.   

    经过实验  DEV-C++是3种最慢的 要4500豪秒   JAVA要650豪秒   DELPHI要1300豪秒
      

  21.   

    不是Delphi不好,而是ADO的工作机制有问题!你用dbExpress控件测试,肯定是最快的!
      

  22.   

    又来了,这个wqrz(滑步向左)怎么不吸取教训呢?
    你前面搞了个歪曲的测试,Delphi的计时包括连接数据库的时间,Java的不包括。
    被人指出来了,你也不道个歉,反而继续玩这种小把戏。你看看你那个“测试”,
    Java的String是不可变字符串,赋值不过是简单的串变量(本质是指针)copy。
    而Delphi的string是可变的、带引用计数的,每次赋值的时候要检查引用计数,调用UniqueString,当然会慢一些。
    两者并不是等价的。
    真正等价的测试有两种方法:
    1. 在Delphi程序中用PChar代替string;
    2. 在Java程序中用StringBuffer代替String。你再比较一下哪个更快?
    Delphi程序应该有两倍以上的速度优势。:)
      

  23.   

    N皇后:
    #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的看要多少时间
      

  24.   

    没办法比较,在我的机器上全是0,包括Java(启用JIT编译)。:){$APPTYPE CONSOLE}
    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.
      

  25.   

    明显楼主既不通JAVA, 更不懂Delphi....
      

  26.   

    拿楼主和白痴比
    楼主不会delphi
    白痴会吃饭
    所以,楼主不如白痴
      

  27.   

    楼主,Delphi 默认游标使用客户端的(ADOQuery1.CursorLocation := clUseClient;
    ),你这样写速度肯定是很慢,如果把游标设为服务器端再看看(ADOQuery1.CursorLocation := clUseServer;).
    这个是基本常识哦!
      

  28.   

    让我想起当年的M$了
    用VB连接本地数据库
    用delphi连接远程数据库
    然后两者比较效率...
    结果不说了
      

  29.   

    楼主懂不懂java.delphi用的是ODBC连,java用的是JDBC,当然不一样。把java的JDBC换成ODBC再试试。
      

  30.   

    楼主无知好吗?
    JAVA是 JDBC直接驱动.并不是在ODBC之上又包装一层 好吧?
    DELPHI 用 DEB速度最快. 你用ADO只能说明你无知
      

  31.   

    高人其实都已经做了说明了~~ 
    LZ确实扭曲了D的真实面目 
    不管什么样,谁能让你吃饱肚子,睡好觉觉 你就去学吧 
    盲目的比较没有任何的意义~~
      

  32.   

    楼主呢,估计是认为自己懂Delphi,又懂Java,认为DElphi板没人会Java,所以来显摆一下。
    没想到呢,Delphi板还真有那么几个不务正业的程序员,懂了那么一点点Java,使得楼主的伟大计划不能实现。
    罪过啊罪过。