gpt4 book ai didi

delphi - 在 Delphi 中模拟虚拟方法

转载 作者:行者123 更新时间:2023-12-03 15:28:46 28 4
gpt4 key购买 nike

我正在为 SSE 指令编写 Delphi 接口(interface)。它是一个类(为了可见性等)TSimdCpu,具有 N 个类方法(每个 SSE 指令一个;明显的性能开销现在不是问题)。

现在我想将我的代码(尽管很慢)的性能与执行相同操作的纯 pascal 代码进行比较。我的第一个猜测是编写一个具有相同方法名称的类似类 TGenericCpu。但是,如果没有公共(public)基类和虚拟方法,我就不能只有一段测试代码来调用它应该运行测试的任何类的方法。理想情况下,我想要类似的东西

TestOn(TSimdCpu);
TestOn(TGenericCpu);

但是我不知道如何使用delphi的虚拟方法来实现这个。 我不想回到虚拟方法有两个原因:一个是性能,另一个是它仅用于测试,对于所有实际用途,它会增加无意义的复杂性。

泛型在这里有用吗?类似的东西

TTest<T> = class
...
T.AddVector(v);
...
TTest<TSimdCpu>.Test;
TTest<TGenericCpu>.Test;

最佳答案

您想要实现一些看起来像虚拟方法的东西,但出于性能原因不使用虚拟方法或接口(interface)。

您需要添加一些间接。创建保存程序变量的记录。举例说明:

type
TAddFunc = function(a, b: Double): Double;

TMyRecord = record
AddFunc: TAddFunc;
end;

然后声明记录的两个实例。一种填充了 SSE 函数,一种填充了非 SSE 引用函数。

此时您已拥有所需的内容。您可以传递这些记录并使用它们提供的间接方式来编写通用测试代码。

不过这种间接方式是有成本的。毕竟,您这里拥有的是接口(interface)的手动实现。预计函数调用的性能开销与接口(interface)类似。

我预计,除非您的操作数是大型数组,否则间接成本将扭曲您的基准。我知道您具体询问了如何使用间接实现测试,但我个人希望使用尽可能接近真实的代码进行测试。这意味着测试直接函数调用。

<小时/>

您询问有关泛型的问题。它们对你来说没有用。为了创建在被测类上参数化的泛型类,您需要从公共(public)基类派生被测类,或者实现公共(public)接口(interface)。然后你又回到了起点。

关于delphi - 在 Delphi 中模拟虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26944111/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com