转载自:http://www.ylzx8.cn/windows/delphi/73200.html

  本人在做一个测试,服务器是IOCP的,我假定最大链接数是50000个。

  测试背景:如果每个链接之间的数据需要服务器中转的话,那么我需要一个数据容器储存用户的关键数据和连接。

  我简单的做了一段简单的代码,关键代码段如下:

RTest = record
Key: Integer;
Name: String[20];
end;
PTest = ^RTest;
TListType = (ltList, ltStrList, ltHashList); var
List: TList;
StrList: TStringList;
HashList: THAshStringList; procedure TfmMain.addToList(Target: TListType);
var
Total, I: Integer;
P_test: PTest;
T, E, Cardinal;
begin
Total:= 5000000; {此处是关键,5万的时候几乎没有任何区别,500万的时候,区别就特别大了}
T:= GetTickCount;
case Target of
ltList:
begin
for I:=0 to Total do
begin
New(P_test);
P_test.Key:= List.Count + 1;
P_test.Name:= 'Tommy' + IntToStr(List.Count + 1);
List.Add(P_test);
end;
E:= GetTickCount;
mmoInfo.Lines.Add('添加5W条记录到List中需要' + TntToStr(E) + '-' + IntToStr(T) + '=' + IntToStr(E-T));
mmoInfo.Lines.Add('List.Count := '+IntToStr(List.Count));
mmoInfo.Lines.Add('最后一项:'+PTest(List.Last).Name);
mmoInfo.Lines.Add('');
end;
ltStrList:
begin
for I:=0 to Total do
begin
New(P_test);
P_test.Key:= StrList.Count + 1;
P_Test.Name:= 'Tommy' + IntToStr(StrList.Count+1);
StrList.AddObject(IntToStr(StrList.Count), TObject(Integer(P_test)));
end;
E:= GetTickCount;
mmoInfo.Lines.Add('添加5W条记录到StrList中需要'+IntToStr(E) + ' - ' + IntToStr(T) + ' = ' + IntToStr(E - T));
mmoInfo.Lines.Add('StrList.Count := '+IntToStr(StrList.Count));
mmoInfo.Lines.Add('最后一项:'+ PTest(StrList.Objects[StrList.Count - 1]).Name);
mmoInfo.Lines.Add('');
end;
ltHashList:
begin
for I := 0 to Total do
begin
New(P_test);
P_test.Key:= HashList.Count + 1;
P_test.Name:= 'Tommy' + IntToStr(HashList.Count + 1);
HashList.AddObject(IntToStr(HashList.Count),TObject(Integer(P_test)));
end;
E:= GetTickCount;
mmoInfo.Lines.Add('添加5W条记录到HashList中需要'+IntToStr(E) + ' - ' + IntToStr(T) + ' = ' + IntToStr(E - T));
mmoInfo.Lines.Add('HashList.Count := '+IntToStr(HashList.Count));
mmoInfo.Lines.Add('最后一项:'+ PTest(HashList.Objects[HashList.Count - 1]).Name);
mmoInfo.Lines.Add('');
end;
end;
end; procedure TfmMain.btnFindClick(Sender: TObject);
var
I,X: Integer;
P_Tmp: PTest;
T,E: Cardinal;
begin
T:= GetTickCount;
for I := 100 to 300 do
begin
X:= StrList.IndexOf(IntToStr(I));
if X <> -1 then
begin
P_Tmp :=PTest(StrList.Objects[X]);
end;
end;
E:= GetTickCount;
mmoInfo.Lines.Add('StrList中查找200项耗时:' + IntToStr(E - T));
T:= GetTickCount;
for I := 100 to 300 do
begin
X:= HashList.IndexOf(IntToStr(I));
if X <> -1 then
begin
P_Tmp :=PTest(HashList.Objects[X]);
end;
end;
E:= GetTickCount;
mmoInfo.Lines.Add('HashList中查找200项耗时:'+ IntToStr(E - T));
end; procedure TfmMain.FormCreate(Sender: TObject);
begin
List:= TList.Create;
StrList:= TStringList.Create;
HashList:= THashedStringList.Create;
addToList(ltList);
addToList(ltStrList);
addToList(ltHashList);
end; procedure TfmMain.FormDestroy(Sender: TObject);
begin
List.Free;
StrList.Free;
HashList.Free;
end;

  

  测试的时候发现,如果是50000 条数据,那么,这样简单的测试任何效率都看不出来,基本都是在0--20毫秒以内完成添加、查询。

  当我加大数量时,变成500万条时,测试的输出结果是:

添加500W条记录到List中需要10015562 - 10014859 = 703
List.Count := 5000001
最后一项:Tommy5000001 添加500W条记录到StrList中需要10016703 - 10015562 = 1141
StrList.Count := 5000001
最后一项:Tommy5000001 添加500W条记录到HashList中需要10017859 - 10016703 = 1156
HashList.Count := 5000001
最后一项:Tommy5000001 StrList中查找200项耗时:0
HashList中查找200项耗时:1344
StrList中查找200项耗时:0
HashList中查找200项耗时:328
StrList中查找200项耗时:0
HashList中查找200项耗时:328
StrList中查找200项耗时:15
HashList中查找200项耗时:313
StrList中查找200项耗时:16
HashList中查找200项耗时:312
StrList中查找200项耗时:16
HashList中查找200项耗时:312
StrList中查找200项耗时:0
HashList中查找200项耗时:328
StrList中查找200项耗时:0
HashList中查找200项耗时:313

  

分析

  时间都浪费在new(P_test)、List.add/StrList.Add/HashList.Add(里面实施不停的reallocmem)。

  查找是HASH快(自带的不算),hash算法不算难,自己写一个,不然弄个二分法都快过于TStringList。

  THashedStringList是继承自TStringList的,只是它覆盖了IndexOf、IndexOfName两个查询方法,扩充易用性,追求效率应该用TStringList,TStringList是直接从TObject继承来的数组链表。

  你也可以看看contnrs单元,里面有队列、栈、启发式哈希表。

  另外,delphi的list都有capacity属性,用于一次性指定count数,而不是每次重新申请list的长度。因为add时,list发现其count不够,会自动从新分配内存扩充自身长度,这些都是耗时的过程,特别在大长度的循环中,如果长度是可知的,这里你可以在循环前给list.capacity:=total;

Delphi容器类之---Tlist,TStringlist,THashedStringlist的效率比较的更多相关文章

  1. Delphi容器类之---TList、TStringList、TObjectList,以及一个例程的代码分析

    转载自:http://blog.csdn.net/jqandjq/article/details/5429137 看了这里标题,大家可能以为我会谈TListBox控件,那就错了.我要谈的是Delphi ...

  2. Delphi容器类之---TList、TObjectList、TComponentList、TClassList

    转载自:http://blog.csdn.net/iseekcode/article/details/4922001 从Delphi5开始VCL中增加了新的Contnrs单元,单元中定义了8个新的类, ...

  3. Delphi 对泛型TList的的改进(TSimpleList)

    TList 有一个比较麻烦的问题是,到底由谁来释放List中的对象或指针. 本例将释放任务教给 TSimpleList ,方便使用. 如果 TList 为于管理对象,还可以实现 AddNewOne 功 ...

  4. Delphi容器类之---TOrderedList、TStack、TQueue、TObjectStack、TObjectQueue

    TOrderedList.TStack.TQueue Contnrs单元还定义了其他三个类:TOrderedList.TStack.TQueue TOrderedList TOrderedList = ...

  5. Delphi解析修改Json文件,基于superobject.pas(ISuperObject)

    在经过一系列的波折后,还是觉得delphi读取并修改json文件来的方便: 在网络上找到一个delphi的三方库ISuperObject,添加到项目后直接引用就行: 下载地址 ISuperObject ...

  6. zw版·Halcon与delphi(兼谈opencv)

    zw版·Halcon与delphi(兼谈opencv) QQ群 247994767(delphi与halcon) <Halcon与delphi>系列,早两年就想写,不过一方面,因为Halc ...

  7. DELPHI与C#语法比较

    1.我做了三年的.NET,也是三个月前因为项目需要转的delphi整个过渡差不多要一周到两周.正常情况两周后就能熟悉delphi.delphi可以调整开发环境的,你把他的属性和解决方案窗口调成和你用V ...

  8. delphi 从 TWebbrowse组件中获取图片

    在 delphi 中使用 TWebbrowse 组件,虽然效率不如用(idhttp之类)模拟操作效率高.但其难度低,上手快,简单粗暴有效. 从网上搜到的处理此问题的文章大多是 ctrl + c 复制到 ...

  9. DELPHI7中 TObjectList sort排序问题

    网上收集了一点东西 TOBJECTLIST里,有自带的排序功能 TLIST,TSTRINGLIST也有,MS是一样的 SORT里有一个参数: Compare:TListSortCompare 那我们先 ...

随机推荐

  1. 四、基于hadoop的nginx访问日志分析---top 10 request

    代码: # cat top_10_request.py #!/usr/bin/env python # coding=utf-8 from mrjob.job import MRJob from mr ...

  2. React项目(二):生命游戏

    引子 这是16年最后的一个练手项目,一贯的感觉就是,做项目容易,写说明文档难.更何况是一个唤起抑郁感觉的项目,码下的每个字,心就如加了一个千斤的砝码. 2016年,有些事我都已忘记,但我现在还记得.2 ...

  3. sqlserver多文件组数据库的备份和还原实战

    数据库文件过大时就要进行数据分区,就是讲数据库拆分到多个文件组中.已方便数据文件管理,提高数据库的读取效能,多文件组如何进行数据库的备份和还原呢,今天主要做多文件组数据库的备份和还原实验. 第一步 创 ...

  4. PHP header函数设置http报文头(设置头部域)

    PHP HTTP 简介: HTTP 函数允许您在其他输出被发送之前,对由 Web 服务器发送到浏览器的信息进行操作. PHP 5 HTTP 函数:header()     向客户端发送原始的 HTTP ...

  5. 【译】使用 CocoaPods 模块化iOS应用

    原文翻译自:Using CocoaPods to Modularize a Big iOS App 为你的移动应用选择正确的架构是一件相当大的事情,这会对你的工作流程造成影响,陷入面对的问题,可能是一 ...

  6. SQL Server 2016正式版安装(超多图)

    微软数据库SQL Server 2016正式版在2016年6月就发布,由于近期工作忙,一直拖到现在才有时间把安装过程写到博客上,分享给大家.本人一直习惯使用英文版,所以版本和截图都是英文版的.废话少说 ...

  7. 如何设置tomcat定时自动重启

    ,今天笔者就跟大家分享一下如何设置tomcat定时自动重启. 第一:把Tomcat6安装成windows 2003服务. 1.首先检查tomcat\bin目录下是否有service.bat文件,如图: ...

  8. Yii2 手动安装yii2-imagine插件

    由于网络的原因使用composer安装Yii框架,实在太过痛苦,所以这里干脆就手动安装yii-imagine的扩展. 首先下载yii2-image和Imagine扩展库,点击链接就可以从百度云下载上传 ...

  9. AMD电脑装完Winsows10后开机蓝屏,报错代码:cdmsnroot_s.sys

    背景:今天装了个WIN10,电脑配置:联想 IdeaPad   Z485      : AMD   A8处理器      .完成安装后电脑没有问题,安装了驱动程序后将           电脑用360 ...

  10. linux命令crontab

    1.需求 服务端计划任务执行 2.例子 使用crontab命令 参考:http://justjavac.com/other/2013/09/22/linux-scheduled-task-cronta ...