• 在Delphi中高效执行JS代码


    因为一些原因,需要进行encodeURIComponent和decodeURIComponent编码,在Delphi中找了一个,首先是发现不能正确编码+号,后面强制处理替换了,勉强可用。

    后面发现多次使用后delphi自带的HttpEncode会报Out of Memory.

    以上可能是我使用的不好,但没有找到解决办法。

    后面想到直接采用运行JavaScript代码,找到了”万一的 Delphi 博客

    在 Delphi 中调用 JavaScript(2) - 万一 - 博客园 (cnblogs.com)

    {此函数需要 ComObj 单元的支持}
    {参数 JsCode 是要执行的 Js 代码; 参数 JsVar 是要返回的变量}
    function RunJs(const JsCode, JsVar: string): string;
    var
      script: OleVariant;
    begin
      try
        script := CreateOleObject('ScriptControl');
        script.Language := 'JavaScript';
        script.ExecuteStatement(JsCode);
        Result := script.Eval(JsVar);
      except
        Result := '';
      end;
    end;

    万一老师的博客,内容简洁,附完全代码(pas和dfm),赞一个!

    这个函数非常好用,但有一个问题,每次执行的时间较长。

    经过研究,是创建时间较长。 所以可以分为2个函数,创建和执行。

    开始时一次创建,需要时多次执行

    完全代码如下:

    unit Unit1;
    
    interface
    
    uses
        ComObj,
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
      script: OleVariant;
    
    implementation
    
    {$R *.dfm}
    function RunJs(const JsCode, JsVar: string): string;
    begin
      try
        script.ExecuteStatement(JsCode);
        Result := script.Eval(JsVar);
      except
        Result := '';
      end;
    end;
    
    procedure PrepareJs;
    begin
      try
        script := CreateOleObject('ScriptControl');
        script.Language := 'JavaScript';
      except
      end;
    end;
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
        I,T : Integer;
        S   : String;
    begin
        T   := GetTickCount;
        PrepareJs;
        for I:=0 to 9999 do begin
            S   := RunJS('var a=encodeURIComponent("abc中文件123")','a')
        end;
        ShowMessage((GetTickCount-T).ToString+' - '+S);
    end;
    
    end.

    经测试,执行10000次仅需要688毫秒

  • 相关阅读:
    C++builder 系统时间
    oracle 备份某张表
    Pascal 中对于常量的初始化
    Delphi 正则表达式
    Lazarus 中的字符串 String,AnsiString,UnicodeString,UTF8String,WideString
    Lazarus 指针,数组,字符串
    准备使用PostgreSQL
    Freepascal 中的泛型使用
    如何生成密钥文件Snk
    挖掘经典:几乎被人遗忘的HTML七种用法
  • 原文地址:https://www.cnblogs.com/maxxua/p/15055379.html
Copyright © 2020-2023  润新知