Delphi 的TStringBuilder防止服务器内存碎片化
Delphi 2009+ 的 System.SysUtils提供了一个类似.Net的StringBuilder,用于存储字符数组。
很多人不明白为什么要用TStringBuilder, Delphi中有string,有几乎所有TStringBuilder的功能函数, System.SysUtils中还有TStringHelper方便扩展String,更方便String的使用。
从Delphi提供的源码看,TStringBuilder与string最大的区别是,TStringBuilder是可以预先申请了内存空间,并限制最大内存空间,不会自动释放,而string是用多少申请多少内存,自动释放。
由此可见TStringBuilder相对于String的优势有2:
1.在开发服务器软件时,使用TStringBuilder池,可以有效地防止内存碎片化.
2.由于不需要开辟新的存储空间存储更大的字符串,预先申请内存的TStringBuilder的运行效率将超越string.
下面的代码中TServerString继承自TStringBuilder,内存空间限制大小为MaxMemorySize,, 当准备写入的字符将要超过内存大小时,将自动抛出异常,
服务器软件可以接获此异常后处理。
下面的代码有待测试:
unit Iocp.ServerString; interface uses SysUtils, Classes; type
TServerStringPool=class;
TServerString=class(TStringBuilder)
protected
class var FPool:TServerStringPool;
constructor Create;
public
destructor Destroy;override;
end; TServerStringPool=class
protected
FList:TThreadList;
public
constructor Create(Capacity:Integer);
destructor Destroy;override;
function GetString:TServerString;
procedure FreeString(Value:TServerString);
end; implementation const
MaxMemorySize=; { TServerString } constructor TServerString.Create;
var
N:Integer;
begin
N:=(MaxMemorySize-InstanceSize) div SizeOf(Char);
inherited Create(N, N);
end; destructor TServerString.Destroy;
begin
FPool.FreeString(Self);
end; { TServerStringPool } constructor TServerStringPool.Create(Capacity: Integer);
var
i: Integer;
L:TList;
begin
inherited Create;
L:=FList.LockList;
try
for i := to Capacity do
begin
L.Add(TServerString.Create);
end;
finally
FList.UnlockList;
end;
end; destructor TServerStringPool.Destroy;
var
i: Integer;
L:TList;
begin
L:=FList.LockList;
try
for i := L.Count- to do
TStringBuilder(L[i]).Free;
finally
FList.UnLockList;
end;
FList.Free;
inherited;
end; procedure TServerStringPool.FreeString(Value: TServerString);
begin
FList.Add(Value);
end; function TServerStringPool.GetString: TServerString;
var
L:TList;
begin
L:=FList.LockList;
try
if L.Count= then
begin
Result:=TServerString.Create;
end
else
begin
Result:=TServerString(L[L.Count-]);
L.Delete(L.Count-);
end;
finally
FList.UnlockList;
end;
end; initialization
TServerString.FPool:=TServerStringPool.Create();
finalization
TServerString.FPool.Free;
end.
Delphi 的TStringBuilder防止服务器内存碎片化的更多相关文章
- Delphi XE TStringBuilder
function T_SunnySky_SDK.JoinItems(AParamDic: TDictionary<string, string>): string; var sb : TS ...
- 记一次 .NET 某电商定向爬虫 内存碎片化分析
一:背景 1. 讲故事 上个月有位朋友wx找到我,说他的程序存在内存泄漏问题,寻求如何解决? 如下图所示: 从截图中可以看出,这位朋友对 windbg 的操作还是有些熟悉的,可能缺乏一定的实操经验,所 ...
- PerfView专题 (第九篇):洞察 C# 中的 LOH 内存碎片化
一:背景 在 内存泄漏 的系列问题中,有一类问题是 内存碎片化 导致的,而且这种更容易发生在 LOH 上,因为它默认不开启 对象压缩,一般遇到这种情况,优先让朋友执行下面的代码应急. GCSettin ...
- DELPHI XE5开发WEB服务器及安卓手机客户端
Xe5开发web服务端和手机客户端 ------------------------------------- Delphi xe5作为最新开发利器,就类似如当年的DELPHI,功能强大,快发速度快, ...
- 如何使用Delphi设计强大的服务器程序
现在网络的流行,使得服务器程序得到了广泛的应用,那么我们使用Delphi如何设计出强壮的服务器呢? 有人说,如果要设计服务器的话,一定要使用VC来设计,其实这个人说的有一定道理,因为如果你要使用Del ...
- delphi中怎么获取服务器的时间
下面是公司的代码,调整成ADO控件,给你参考一下: function GetNetDate: TDateTime; begin with TADOQuery.Create(nil) do begin ...
- delphi -----(去掉窗口最大化,最小化、关闭),主窗口,和子窗口之间的设置
一.去掉窗口最大化,最小化.关闭 borderIcons:biSystemMenu:false borderStyle:bsSizeable 二.主子窗口 主main: //调用子窗体procedur ...
- 解决.net的堆碎片化带来的内存占用过大的问题
场景 使用WCF开发的服务端在多个客户端登录后,其服务器的内存占用不断增加. 分析 使用Windbg分析得到内存碎片化严重,其中包含了非常大的空闲空间,最大的一块竟然有150M,真正使用的空间其实很小 ...
- 服务器php-cgi.exe进程过多,导致CPU占用100%的解决方法
再使用iis服务器中经常会出现php-cgi.exe进程过多,导致CPU占用100%,最终造成网站运行过慢甚至卡死的情况,重启iis会好一会,过一段时间久出现这种情况,为什么会出现这种情况呢,应该怎么 ...
随机推荐
- Perl常用语法
本文主要为了方便阅读.编写perl脚本而记录的常用的命令.语法. 一.条件判断语法 注意,数字 0, 字符串 '0' . "" , 空 list () , 和 undef 为 fa ...
- Shell使用手册
1.循环数组 list=(20180531 20180430 20180331 20180228 20180131 20171231 20171130 20171031 20170930 201708 ...
- 对volatile不具有原子性的理解
在阅读多线程书籍的时候,对volatile的原子性产生了疑问,问题类似于这篇文章所阐述的那样.经过一番思考给出自己的理解. 我们知道对于可见性,Java提供了volatile关键字来保证可见性.有序性 ...
- css属性之flex属性
flex属性 规定了弹性元素如何伸长或缩短以适应flex容器中的可用空间.是一个简写属性,可以同时设置flex-grow, flex-shrink, flex-basis三个子属性. /* Basic ...
- linux mint sublime3的c编译环境配置
通过Tools>>Build System>>New Build System弹出新建文件来设置,也可以replace覆盖以前的 一种方式,konsole可以通过sudo ap ...
- [枫叶学院] Unity3d高级开发教程 工具集(一) 哈希列表——强大的自己定义数据集
在日常开发中.数据集合是我们不可缺少的重要工具之中的一个.在C#中,.Net Framework也为我们提供了种类繁多,功能多样的数据集工具.在此,我基于List<T> 和 HashTab ...
- [19/04/13-星期六] 网络编程_基本概念(关注传输层、数据传输,TCP和UDP)
一.概念 ▪ 什么是计算机网络? 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统, 网络管理软件及网络通信协议的管理和协调下,实现资源共享和信 ...
- 【问题】 百度地图marker不在中心点处
问题: var map = new BMap.Map("mapshow"); map.centerAndZoom(point, 15); 显示百度地图时,map.centerAnd ...
- 判断是否POST提交
if(strtolower($_SERVER['REQUEST_METHOD']) == 'post'){} //判断是否POST提交
- mysql5.6编译安装
1.安装编译源码所需的工具和库 yum install gcc gcc-c++ ncurses-devel perl -y yum -y install wget gcc-c++ ncurses nc ...