背景:
在使用嵌入式汇编语言优化某些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) 我已经开始转换要在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) 据我所知,文档中Android NDK中两种支持的ARM体系结构之间的区别仅在于支持的CPU指令集.真的是这样吗?调用约定,系统调用序列或其他内容没有区别吗?
我想知道如果我将模块编译为ARM对象文件(使用NDK以外的编译器 - 特别是Free Pascal),将ARMv6指定为架构,然后将其链接到armeabi和armeabi-v7a共享库,将会发生什么.除了通过我自己的基于C的接口之外,FPC位不应该既不执行系统调用也不执行Java调用.
编辑:一个hello world库,使用FPC for ARM编译,链接并在ARMv7a仿真器下运行.
我不是Pascal新手,但直到现在我仍然不知道为什么Delphi和Free Pascal通常声明参数并将值返回为有符号整数,而我看到它们应该始终是正数.例如:
Pos()返回Integer的类型.有可能成为负面的吗?SetLength()将NewLength参数声明为Integer的类型.字符串是否有负长度?System.THandle宣称为Longint.手柄有负数吗?有许多决定,如Delphi和Free Pascal.这背后有什么考虑因素?
我需要从字符串中提取数字并将它们放入列表中,但是有一些规则,例如识别提取的数字是整数还是浮点数.
这项任务听起来很简单,但随着时间的推移,我发现自己越来越困惑,并且可以真正做到一些指导.
以下面的测试字符串为例:
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
为了使这一点更清晰,在上面引用所需输出的测试字符串应该如下:
从上图中可以看出,浅蓝色表示浮点数,浅红色表示单个整数(但请注意浮点数如何连接在一起分成单独的浮点数).
- 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
- 4(整数)
- 8.1(浮动)
- 123.45(浮动)
- 67.8(浮动)
- 9(整数)
为了给出更好的想法,我在测试时创建了一个新项目,如下所示:
现在进入实际任务.我想也许我可以从字符串中读取每个字符,并根据上面的规则识别有效数字,然后将它们拉入列表.
以我的能力,这是我能管理的最好的:
代码如下:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type …Run Code Online (Sandbox Code Playgroud) 我对用Delphi/Pascal或C++编写的库(用于windows)感兴趣,它允许我记录(到视频格式)桌面屏幕,要求:
如果可能的话:
如果有任何机会,我没有解释正确的事情,请随时问我所以我可以改写或提供更多细节等.
在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中的内存泄漏?
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.
对于在Pascal中返回值的函数,FunctionName := SomeVal;使用赋值.我认为它不会像return在C中那样在那个确切的位置停止函数执行.return在Pascal中有类似C的东西吗?(我正在使用FreePascal编译器)
我需要在Free Pascal中实现简单的性能基准测试.在Delphi中我使用的TStopWatch是Diagnostics单元的记录,我可以在Free Pascal/Lazarus中使用什么?
freepascal ×10
delphi ×6
pascal ×4
lazarus ×3
abi ×1
android ×1
android-ndk ×1
arrays ×1
assembly ×1
c++ ×1
const ×1
delphi-2010 ×1
delphi-xe2 ×1
macos ×1
memory-leaks ×1
optimization ×1
performance ×1
stopwatch ×1
webkit ×1
x86-64 ×1