通过密钥访问数据的最快方法

时间:2013-03-28 10:46:47

标签: delphi generics

我有数百个必须用钥匙访问的变量 键的类型是字符串(最大值:50个字符),数据是字节数组(最大值:500字节)。

我用这种方式:
定义这种类型:

type  
  TMyBuf          = array[0..(500-1)] of Byte;
  TMyKey          = string[50];
  TMyBufs         = TDictionary<TMyKey,TMyBuf>;
var
  MyBufs     :TMyBufs;

并使用:

var vMyBuf     :TMyBuf;
    vMyData    :TBytes ABSOLUTE vMyBuf;
    vMyDataLen :Word;
begin
    List := srvData.Contexts.LockList;
    SetLength(vMyBuf, 500);
    try
      if(List.Count > 0) then begin
        for i := 0 to List.Count-1 do begin
          with TMyContext(List[I]) do begin
            if SetedIdent then begin
              try
                vMyBuf:= MyBufs.Items[SeledData];
                //extract length of data which stored in two byte
                vMyDataLen:= ( ( (vMyBuf[1] shl 8)and $FF00) or (vMyBuf[0] and $FF) );
                Connection.IOHandler.Write(vMYData, vMYDataLen);
              finally
              end;
            end;
          end;
        end;
      end;
    finally
      srvData.Contexts.UnlockList;
      SetLength(vMyBuf, 0);
    end;
end;

有类似的代码来写数据。

1 。是否直接访问了价值观?无需复制值字典(vMyBuf:= MyBufs.Items[SeledData];)。

2 。有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

最好使用Classes的隐式by-reference语义 并使用TObjectDictionary。

type  
  TMyBuf          = class
      public
       Data:array[0..(500-1)] of Byte;
  end;
  TMyKey          = string[50];
  TMyBufs         = TObjectDictionary<TMyKey,TMyBuf>;
var
  MyBufs     :TMyBufs;

这将允许您轻松地将单个字节写入字典。你当然必须通过调用它的构造函数来分配每个TMyBuf。如果您使用TObjectDictionary,它可以拥有(意味着知道如何释放)放入其中的所有对象引用,那么清理也会更容易。

您可能不知道的另一件事是,在Unicode delphi上,string[50]是一个古老的TurboPascal / DOS时代shortstring类型,而不是unicode字符串。

我建议除非你真的需要,否则你不用担心使用字符串[50]而只是使用字符串。如果您希望在运行时验证字符串是50个字符或更少并抛出异常,那么就这样做。