指令执行时间(30分)

  • 主题发起人 主题发起人 太平洋
  • 开始时间 开始时间

太平洋

Unregistered / Unconfirmed
GUEST, unregistred user!
Str1:=copy(Str2,i,80);与下面的语句比较哪个用时长?分别用时多长?
while j<=80 do
begin
Str1[j]:=Str2;
inc;
inc[j];
end;

另外,下面一个查询语句大概要多少时间?若记录为1000条:
with Query1 do
begin
close;
sql.clear;
sql.add('select * from 表1 where 采集时间=:day');
params[0].AsString :=ResultTimeStr;
prepare;
open;
end;
还有,当给一个表添加记录要多少时间?表有25个字段。
或者用什么方法来计算指令执行时间?一般各种Ddelphi的指令执行时间是多少?
分不多,但希望得到帮助,谢谢!
 
为什么我的帖子连看的人都很少?难道只有PLMM大家才喜欢?唉~~~~~~~
 
我看完了,但不晓得回答
 
计算指令执行时间没有必要,只要计算过程/函数的执行时间就可以了,方法如下:

var
StartTime: TDateTime;
begin
// 记下开始时间
StartTime := Now;
// TODO: 这里写要测速的执行代码
...

// 显示时间差,精确到毫秒。
ShowMessage(FormatDateTime('hh:nn:ss zzz', Now - StartTime);
end;
 
P.S.
如果测出的时间差不够一毫秒,那么可以用一个循环把要测速的代码多执行几次,将时间差放大。
 
多谢楼上!我试试,但最好有指令执行时间,象汇编一样。
我需要执行时间快的指令,现在我处理32K数据,再添加到数据库,用的时间竟然将近80秒!!!
而且现在几乎没添加记录,因为是测试的数据,几乎一样,判断相同,则不添加记录。
当处理更多的数据那岂不……
 
因为你"太平"了,呵呵.开玩笑.
你可以用gettickcount这个api来完成,
执行前get一次
执行后再来一次,一减就行了.不过在windows9x上这个值不是很准.误差在17ms左右,
这是系统的一个限制.如果还要精确,请用多媒体定时器.我有控件,你要否?(只限98,有原码)
 
to Crane:
谢谢帮助!你的控件我要。 发到postlinhai@sina.com
另外我用Traveller的方法试了一下,我数据表中只有几个记录,我给定一个时间,然后判断
表中是否有此时间的记录,若没有,则添加一个给定数据的记录(表共25字段)。发现,若
记录存在,花时间为110毫秒,若记录不存在,花时间为1320毫秒,如此说,添加记录要很费时?
我那么多数据,该怎么解决?我是用Query的。
 
如果你的要求不是很高的话可以用 getticktime 这个API函数就可以啦/
再高一点的可以用QueryPerformanceFrequency ,和QueryPerformanceCount,
更高的可以考虑一下利用对奔腾RDTSC指令的封装,这样你就能够得到十亿分
之一秒的时间间隔。
 
多谢各位!
其实我的要求也不是很高,经过测试我发现主要花的时间还是在数据库方面,现在我还只是
用一个表测试,我的表可能最多5-6个。请问各位用Query时是否都象我这样费时?
当然,我的这个帖子的问题算是解决了,分可以给大家了,但还是请再帮助一下,怎么解决
我的程序耗时问题?
 
你的问题是网络流量过大,你的后台数据库是什么?
 
一般使用 Traveller的方法就可以了,没必要这么准。

想准?电脑的时钟本身就不准!我搞过mcu,就有误差!不如用原子钟来测试吧,呵...
 
to Crane:
我只是在本地使用,用的是Access,是它的问题吗?
 
现在还用Access啊,买个盗版SQL SERVER 2000也不错啊:)/
其实如果你想查询速度很快的话,可以采用线程并发。那你同时查很多表都一样啦/
 
天哪,你用ACCESS作大数据?这样:
1.最好用ADO连接件,会稍快。
2.用Cleintdataset,在本地使用的方式(和query,datasetprovider都放到
datamodual中),将其Package RowNumber设置一下,例如让它
20行20行的取数据,
3.看看你的表是否都有关键字,索引建了没。
4.不要用诸如select *之类的语句,delphi就怕这个。
 
ACCESS是文件型数据库,用线程只怕会更慢,使不得~~
 
数据库操作浪费的事件主要是数据引擎功能调用的执行时间,拿到指令执行时间也没有用处的。
 
用QueryPerformanceFrequency和QueryPerformanceCount,毫秒级别的
 
你的思路存在错误,有数据库存在,你还将时间计较在指令的执行上?
其实数据库执行的时间远远大于你的循环、赋值等的时间。
如果你要进行实时采样,那么就不要使用数据库,开一块内存或者使用DMA(虽然我不会),那样会快起来。
如果你是进行数据库处理,那么根本就不要计较指令的执行时间。
 
我隔了一会没来看,想不到那么多热心的朋友在关注,让我很是感动(还好,没流泪~~~~)
当初领导说用Access,我就用了,其实我原来对编程一点也不懂的,现在被迫干了几个月,
还是非常菜(笨啊),唉
to Crane:
您说不用 Select * 之类的语句,那应该用什么,怎么判断一条记录是否存在?
我用下面的语句来判断是否有记录存在的:
with TableForm.Query1 do
begin
close;
sql.clear;
sql.add('select * from '+MapForm.station_name+'开关量表 where 采集时间=:day');
params[0].AsString :=ResultTimeStr;//时间值
prepare;
open;
if recordcount = 0 then
.......//处理数据,添加记录
改天再给大家加点分
先祝大家 周末愉快!
 
后退
顶部