delphi - 提高 Delphi 2010 自己的调试可视化工具的速度

标签 delphi debugging toolsapi

我为TDataSet编写了Delphi调试可视化工具来显示当前行的值,源+屏幕截图:http://delphi.netcode.cz/text/tdataset-debug-visualizer.aspx 。工作很好,但速度很慢。我做了一些优化(如何获取字段名称),但仍然只有 20 个字段需要 10 秒才能显示 - 非常糟糕。

主要问题是IOTAThread90似乎很慢。如下所示的主代码使用的Evaluate,这个过程花费了大部分时间,符合**大约80%的时间。 FExpression是代码中TDataset的名称。

procedure TDataSetViewerFrame.mFillData;
var
 iCount: Integer;
 I: Integer;
 //  sw: TStopwatch;
 s: string;
 begin
 //  sw := TStopwatch.StartNew;
   iCount := StrToIntDef(Evaluate(FExpression+'.Fields.Count'), 0);
   for I := 0 to iCount - 1 do
   begin
     s:= s + Format('%s.Fields[%d].FieldName+'',''+', [FExpression, I]);
  //  FFields.Add(Evaluate(Format('%s.Fields[%d].FieldName', [FExpression, I])));
     FValues.Add(Evaluate(Format('%s.Fields[%d].Value', [FExpression, I]))); //**
   end;
 if s<> '' then
   Delete(s, length(s)-4, 5);
 s := Evaluate(s);
 s:= Copy(s, 2, Length(s) -2);
 FFields.CommaText := s;
{  sw.Stop;
 s := sw.Elapsed;
 Application.MessageBox(Pchar(s), '');}
end;

现在我不知道如何提高性能。

最佳答案

Evaluate 需要做大量的工作。编译器需要对其进行编译,将符号解析为内存地址,而评估属性可能会导致调用函数,这需要调试器将参数复制到被调试者中,设置堆栈帧,调用要调用的函数,收集结果 - 这涉及暂停和恢复调试程序。

我只能建议尝试将更多工作打包到 Evaluate 调用中。我不能 100% 确定调试器和评估器(编译器的一部分)之间的交互如何适用于这些可视化工具,但批处理尽可能多的工作可能会有所帮助。在循环后调用 Evaluate 之前,尝试构建更复杂的表达式。您可能需要使用一些转义或定界约定来解压结果。例如,想象一下构建字段值列表并将它们作为逗号分隔字符串返回的表达式是什么样子 - 但您需要在值本身中转义逗号。

关于delphi - 提高 Delphi 2010 自己的调试可视化工具的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2556146/

相关文章:

debugging - CUDA 调试,或者如何在不禁用优化的情况下获取 cuda-gdb 中的源代码行?

delphi - 为什么 `as` 运算符可能会抛出令人讨厌的 EAccessViolation 而不是正常的 EIntfCastError ?

delphi - 来自delphi IDE专家的如何枚举IDE的形式

delphi - bpl delphi专家和dll delphi专家有哪些区别

c++ - 有人可以帮我吗?为什么它不编译?

delphi - 在代码中设置文本时,MaxLength属性无效

Delphi:如何将Click事件分配给对象的方法?

delphi - adoTable 出现问题

Eclipse错误: No source available for ""

string - 在Delphi中解析包含变量名称的字符串