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防止服务器内存碎片化的更多相关文章

  1. Delphi XE TStringBuilder

    function T_SunnySky_SDK.JoinItems(AParamDic: TDictionary<string, string>): string; var sb : TS ...

  2. 记一次 .NET 某电商定向爬虫 内存碎片化分析

    一:背景 1. 讲故事 上个月有位朋友wx找到我,说他的程序存在内存泄漏问题,寻求如何解决? 如下图所示: 从截图中可以看出,这位朋友对 windbg 的操作还是有些熟悉的,可能缺乏一定的实操经验,所 ...

  3. PerfView专题 (第九篇):洞察 C# 中的 LOH 内存碎片化

    一:背景 在 内存泄漏 的系列问题中,有一类问题是 内存碎片化 导致的,而且这种更容易发生在 LOH 上,因为它默认不开启 对象压缩,一般遇到这种情况,优先让朋友执行下面的代码应急. GCSettin ...

  4. DELPHI XE5开发WEB服务器及安卓手机客户端

    Xe5开发web服务端和手机客户端 ------------------------------------- Delphi xe5作为最新开发利器,就类似如当年的DELPHI,功能强大,快发速度快, ...

  5. 如何使用Delphi设计强大的服务器程序

    现在网络的流行,使得服务器程序得到了广泛的应用,那么我们使用Delphi如何设计出强壮的服务器呢? 有人说,如果要设计服务器的话,一定要使用VC来设计,其实这个人说的有一定道理,因为如果你要使用Del ...

  6. delphi中怎么获取服务器的时间

    下面是公司的代码,调整成ADO控件,给你参考一下: function GetNetDate: TDateTime; begin with TADOQuery.Create(nil) do begin ...

  7. delphi -----(去掉窗口最大化,最小化、关闭),主窗口,和子窗口之间的设置

    一.去掉窗口最大化,最小化.关闭 borderIcons:biSystemMenu:false borderStyle:bsSizeable 二.主子窗口 主main: //调用子窗体procedur ...

  8. 解决.net的堆碎片化带来的内存占用过大的问题

    场景 使用WCF开发的服务端在多个客户端登录后,其服务器的内存占用不断增加. 分析 使用Windbg分析得到内存碎片化严重,其中包含了非常大的空闲空间,最大的一块竟然有150M,真正使用的空间其实很小 ...

  9. 服务器php-cgi.exe进程过多,导致CPU占用100%的解决方法

    再使用iis服务器中经常会出现php-cgi.exe进程过多,导致CPU占用100%,最终造成网站运行过慢甚至卡死的情况,重启iis会好一会,过一段时间久出现这种情况,为什么会出现这种情况呢,应该怎么 ...

随机推荐

  1. select server

    server with select #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> ...

  2. 数据分析之pandas常见的数据处理(四)

    常见聚合方法 方法 说明 count 计数 describe 给出各列的常用统计量 min,max 最大最小值 argmin,argmax 最大最小值的索引位置(整数) idxmin,idxmax 最 ...

  3. SQL查询含有%号的字段

    select * from EMS_ANNOUNCEMENT where 1=1  and title like '%\%%'  escape '\'

  4. iOS开发之UIView

    在iPhone里你能看到的.摸到的,都是UIView. 视图坐标系统: UIKit中的坐标都是基于这样的坐标系统:以左上角为坐标的原点,原点向下和向右为坐标轴方向. 坐标值由浮点数来表示,内容的布局和 ...

  5. IntelliJ IDEA 与Eclipse Link with Editor等价功能设置

    Link With Editor是Eclipse内置功能中十分小巧,但却异常实用的一个功能. 这个开关按钮 (Toggle Button) 出现在各式导航器视图 ( 例如 Resource Explo ...

  6. What Shape Layers Are-CAShapeLayer

    矢量图.gpu直接使用.占用内存小 What Shape Layers Are Shape layers are layers capable of defining shapes as vector ...

  7. 关于c++ list容器的操作摸索

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/chaoweilanmao/article/details/30793859 #include< ...

  8. 【jQuery】jQuery与Ajax的应用

    1.demo1 <script language="javascript" type="text/javascript"> //通过这个函数来异步获 ...

  9. Java之关于JSTL引入问题

    错误信息:Can not find the tag library descriptor for “http://java.sun.com/jstl/core”JSTL taglib需要jstl.ja ...

  10. 创建DBLink----Oracle和mysql

    Oracle: DROP PUBLIC DATABASE LINK NM_HN; CREATE PUBLIC DATABASE LINK NM_HN CONNECT TO XZXT IDENTIFIE ...