标签: freepascal

为什么引入无用的MOV指令会加速x86_64汇编中的紧凑循环?

背景:

在使用嵌入式汇编语言优化某些Pascal代码时,我注意到了一条不必要的MOV指令,并将其删除.

令我惊讶的是,删除不必要的指令会导致我的程序变慢.

我发现添加任意无用的MOV指令可以进一步提高性能.

效果不稳定,并且基于执行顺序进行更改:相同的垃圾指令向上或向下移动一行会产生减速.

我知道CPU会进行各种优化和精简,但这看起来更像是黑魔法.

数据:

我的代码版本有条件地在运行时间的循环中编译三个垃圾操作2**20==1048576.(周围的程序只计算SHA-256哈希值).

在我相当老的机器(英特尔(R)Core(TM)2 CPU 6400 @ 2.13 GHz)上的结果:

avg time (ms) with -dJUNKOPS: 1822.84 ms
avg time (ms) without:        1836.44 ms
Run Code Online (Sandbox Code Playgroud)

程序在循环中运行25次,每次运行顺序随机变化.

摘抄:

{$asmmode intel}
procedure example_junkop_in_sha256;
  var s1, t2 : uint32;
  begin
    // Here are parts of the SHA-256 algorithm, in Pascal:
    // s0 {r10d} := ror(a, 2) xor ror(a, 13) xor …
Run Code Online (Sandbox Code Playgroud)

optimization performance assembly freepascal x86-64

217
推荐指数
3
解决办法
3万
查看次数

Webview无法使用Delphi XE2在MacOS中显示

我已经开始转换要在Delphi中使用的Webview接口.我已设法加载webkit库,并且调用的接口方法似乎正常工作,但是,我似乎无法在主窗体上显示Webview.

下面是我声明的接口

  WebFrameClass = interface(NSObjectClass)
  ['{7BE750C8-DFEC-4870-851A-12DBCB0B78F6}']
  end;

  WebFrame = interface(NSObject)
  ['{BCFA04BE-41AB-4B78-89C0-3330F12C7695}']
    procedure loadRequest(request: NSURLRequest); cdecl;
  end;
  TWebFrame = class(TOCGenericImport<WebFrameClass, WebFrame>)  end;

  WebViewClass = interface(NSViewClass)
  ['{0D9F44B7-09FD-4E35-B96E-8DB71B9A2537}']
    {class} function canShowMIMEType(MIMEType: NSString): Boolean; cdecl;
  end;

  WebView = interface(NSView)
  ['{C36D8016-2FCB-49F0-BA1C-C9913A37F9AC}']
    procedure clos; cdecl;
    procedure setHostWindow(hostWindow: NSWindow); cdecl;
    function initWithFrame(frame: NSRect; frameName: NSString; groupName: NSString): Pointer; cdecl;
    function mainFrame: WebFrame; cdecl;
  end;
  TWebView = class(TOCGenericImport<WebViewClass, WebView>)  end;
Run Code Online (Sandbox Code Playgroud)

以下是构建WebView的代码:

procedure TForm2.Button1Click(Sender: TObject);
var
  PWebView: Pointer;
  FwkMod: HMODULE;
  MyWebView: WebView;
  urlStr: NSURL;
  urlreq: NSURLRequest;
const
  WebKitFWK: string …
Run Code Online (Sandbox Code Playgroud)

delphi macos webkit freepascal delphi-xe2

73
推荐指数
1
解决办法
2245
查看次数

armeabi和armeabi-v7a之间的区别

据我所知,文档中Android NDK中两种支持的ARM体系结构之间的区别仅在于支持的CPU指令集.真的是这样吗?调用约定,系统调用序列或其他内容没有区别吗?

我想知道如果我将模块编译为ARM对象文件(使用NDK以外的编译器 - 特别是Free Pascal),将ARMv6指定为架构,然后将其链接到armeabi和armeabi-v7a共享库,将会发生什么.除了通过我自己的基于C的接口之外,FPC位不应该既不执行系统调用也不执行Java调用.

编辑:一个hello world库,使用FPC for ARM编译,链接并在ARMv7a仿真器下运行.

android freepascal cpu-architecture abi android-ndk

22
推荐指数
1
解决办法
4万
查看次数

为什么Delphi和Free Pascal通常更喜欢有符号整数数据类型到无符号整数?

我不是Pascal新手,但直到现在我仍然不知道为什么DelphiFree Pascal通常声明参数并将值返回为有符号整数,而我看到它们应该始终是正数.例如:

  • Pos()返回Integer的类型.有可能成为负面的吗?
  • SetLength()NewLength参数声明为Integer的类型.字符串是否有负长度?
  • System.THandle宣称为Longint.手柄有负数吗?

有许多决定,如Delphi和Free Pascal.这背后有什么考虑因素?

delphi pascal freepascal

17
推荐指数
4
解决办法
2077
查看次数

是否有一种简单的方法可以按照某些规则从字符串中提取数字?

我需要从字符串中提取数字并将它们放入列表中,但是有一些规则,例如识别提取的数字是整数还是浮点数.

这项任务听起来很简单,但随着时间的推移,我发现自己越来越困惑,并且可以真正做到一些指导.


以下面的测试字符串为例:

There are test values: P7 45.826.53.91.7, .5, 66.. 4 and 5.40.3.
Run Code Online (Sandbox Code Playgroud)

解析字符串时要遵循的规则如下:

  • 数字不能以字母开头.

  • 如果找到一个数字并且后面没有小数点,则该数字为整数.

  • 如果它发现了一些和后跟一个小数点然后数为浮点数,例如5.

  • 〜如果更多数字跟随小数点,那么数字仍然是一个浮点数,例如5.40

  • 〜进一步发现小数点应该分解数字,例如5.40.3变为(5.40 Float)和(3 Float)

  • 如果一个字母例如在小数点后面,例如3.H然后仍然3.作为Float 添加到列表中(即使从技术上讲它是无效的)

例1

为了使这一点更清晰,在上面引用所需输出的测试字符串应该如下:

enter image description here

从上图中可以看出,浅蓝色表示浮点数,浅红色表示单个整数(但请注意浮点数如何连接在一起分成单独的浮点数).

  • 45.826(浮动)
  • 53.91(浮法)
  • 7(整数)
  • 5(整数)
  • 66.(浮动)
  • 4(整数)
  • 5.40(浮动)
  • 3.(浮动)

请注意,66之间有故意的空格.和3.以上是由于数字的格式化方式.

例2:

Anoth3r Te5.t string .4 abc 8.1Q 123.45.67.8.9

enter image description here

  • 4(整数)
  • 8.1(浮动)
  • 123.45(浮动)
  • 67.8(浮动)
  • 9(整数)

为了给出更好的想法,我在测试时创建了一个新项目,如下所示:

enter image description here


现在进入实际任务.我想也许我可以从字符串中读取每个字符,并根据上面的规则识别有效数字,然后将它们拉入列表.

以我的能力,这是我能管理的最好的:

enter image description here

代码如下:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type …
Run Code Online (Sandbox Code Playgroud)

delphi freepascal lazarus

16
推荐指数
2
解决办法
920
查看次数

屏幕录像机

我对用Delphi/Pascal或C++编写的库(用于windows)感兴趣,它允许我记录(到视频格式)桌面屏幕,要求:

  • 必须能够指定帧速率,或者至少能够记录@ 5fps;
  • 必须是开源的或免费的;
  • 输出格式几乎可以是任何格式,但质量必须足够好才能从录制中读取文本;

如果可能的话:

  • 没有颜色的记录选项(灰度);
  • 多显示感知 ;
  • 跨平台(Windows和Linux,其他平台也不错,但不是必需的);

如果有任何机会,我没有解释正确的事情,请随时问我所以我可以改写或提供更多细节等.

c++ delphi pascal freepascal delphi-2010

12
推荐指数
1
解决办法
2万
查看次数

如何检测Free Pascal/Lazarus中的内存泄漏?

Delphi中,我通常会编写一个简单的泄漏测试,如下所示:

program MemLeak;

{$APPTYPE CONSOLE}

uses
    SysUtils;

procedure Leak;
begin
    { Put leaking code here. }
end;

begin
    ReportMemoryLeaksOnShutdown:= True;
    try
        Leak;
    except
        on E: Exception do
            Writeln(E.ClassName, ': ', E.Message);
    end;
end.
Run Code Online (Sandbox Code Playgroud)

如何检测Free Pascal/Lazarus中的内存泄漏?

delphi memory-leaks freepascal lazarus

12
推荐指数
2
解决办法
6453
查看次数

为什么Pascal const数组实际上不是常量?

  Program ConstTest;
  Const constVar = 1;
  Begin
    constVar := 3;
    WriteLn(constVar);
  End.
Run Code Online (Sandbox Code Playgroud)

很明显上面的代码不会编译,因为改变常量的值是不对的.但是,下面的代码将编译,并将返回"1; 5; 3;",即使数组是const:

Program ConstTest;
  Const constArr:Array [1..3] Of ShortInt = (1,2,3);
  Var i:ShortInt;
  Begin
    constArr[2] := 5;
    For i:=1 To 3 Do WriteLn(constArr[i],'; ');
  End.
Run Code Online (Sandbox Code Playgroud)

那么,是什么导致了这种行为?为什么常数实际上不是常量?

我正在使用FreePascal Compiler 2.2.0 for Win32.

arrays pascal const freepascal

11
推荐指数
1
解决办法
4637
查看次数

返回Pascal中的值

对于在Pascal中返回值的函数,FunctionName := SomeVal;使用赋值.我认为它不会像return在C中那样在那个确切的位置停止函数执行.return在Pascal中有类似C的东西吗?(我正在使用FreePascal编译器)

pascal freepascal

11
推荐指数
1
解决办法
1万
查看次数

什么是Free Pascal相当于Delphi的TStopWatch?

我需要在Free Pascal中实现简单的性能基准测试.在Delphi中我使用的TStopWatch是Diagnostics单元的记录,我可以在Free Pascal/Lazarus中使用什么?

delphi freepascal stopwatch lazarus

11
推荐指数
2
解决办法
2442
查看次数