加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 指针^与s [1]

发布时间:2020-12-15 10:15:59 所属栏目:大数据 来源:网络整理
导读:在一个从磁盘读取数据(数据意义上是字符串)的函数中,我应该更喜欢哪种?哪个更好? A) DiskStream.Read(Pointer(s)^,Count)orB) DiskStream.Read(s[1],Count) 注意: 我知道两者都有相同的结果。 我知道在调用Read之前我必须设置S的SetLength。 UPDATE S是A
在一个从磁盘读取数据(数据意义上是字符串)的函数中,我应该更喜欢哪种?哪个更好?
A) DiskStream.Read(Pointer(s)^,Count)
or
B) DiskStream.Read(s[1],Count)

注意:
我知道两者都有相同的结果。
我知道在调用Read之前我必须设置S的SetLength。

UPDATE

S是AnsiString。

这里是完整的功能:

{从文件中读取一堆字符。为什么’ReadChars’而不是’ReadString’?此函数读取C字符串(字符串的长度也未写入磁盘)。所以,我必须给出字符数作为参数读取。 }

function TMyStream.ReadChars(out s: AnsiString; CONST Count: Longint): Boolean; 
begin
 SetLength(s,Count);
 Result:= Read(s[1],Count)= Count;
end;

速度测试

在我的速度测试中,第一种方法比第二种方法要快一点。我使用了一个400MB的文件,我从中读取了大约20万次的字符串。该过程被设定为高优先级。

最好的阅读时间是:
变体B为1.35,变体A为1.37。
平均:
平均而言,B的得分也比A的20分。

对于每个变体,测试重复15次。

差异真的很小。它可能落入测量误差范围。
如果我更经常地阅读字符串和从较大的文件中读取字符串,可能会很重要。
但是现在我们说两行代码都是一样的。

回答
变体A – 可能会更小一点点
变体B – (显然)更容易阅读,更多的是Delphi-ish。我的首选

注意:
我在TStreamReadBuffer示例中看到Embarcadero使用变体A,但使用了TBytes而不是String。

解决方法

请注意,运行时
1. DiskStream.Read(Pointer(s)^,Count)
2. DiskStream.Read(s[1],Count)

1.版本会更快。

但是您必须确保s变量显式是本地的,或者您在循环之前已经调用了UniqueString。

由于指针^不会调用UniqueString?()低级隐藏的RTL调用,它将比s [1]更快,但是如果s字符串变量在当前上下文和其他上下文(例如,如果从属性值从函数检索最后一个内容,或者s作为参数发送到另一个方法)。

事实上,从内容中读取AnsiString的最快的正确方法是:

s := '';
  SetLength(s,Count);
  DiskStream.Read(pointer(s)^,Count);

要么

SetString(s,nil,Count);

第二个版本等于第一版,但只有一行。

将s设置为’将在SetLength()中调用FreeMem()AllocMem()而不是ReallocMem(),因此将避免对move()的调用,因此将会更快一些。

事实上,由s [1]生成的UniqueString?()RTL调用将非常快,因为您在调用它之前已经调用了SetLength():因此,s已经是唯一的,而UniqueString?()RTL调用将几乎返回立即。在分析之后,两个版本之间没有太大的速度差异:几乎所有的时间都花在字符串分配和内容从磁盘移动。也许s [1]被发现是更“。ish”。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读