ios - Objective C float 与 int、CGPoint 与基于自定义 int 的结构性能

标签 ios objective-c c

基于这篇文章中的论点:Performance of Built-in types ,我是否可以得出结论,基于 int 的点结构的自定义实现比基于 float 的 CGPoint 更快或更有效?我已经审查了许多有关类型性能差异的帖子,但没有找到包含由结构进一步包裹的场景的帖子。 谢谢。

// Coord 
typedef struct {
    int x;
    int y;
} Coord;

CG_INLINE Coord CoordMake(int x, int y){
    Coord coord; coord.x = x; coord.y = y; return coord;
}

CG_INLINE bool CoordEqualToCoord(Coord coord, Coord anotherCoord) {
    return coord.x == anotherCoord.x && coord.y == anotherCoord.y;
}

CG_INLINE CGPoint CGPointForCoord(Coord coord) {
    return CGPointMake(coord.x, coord.y);
}

编辑:我已经完成了纯粹的算术测试,直到数百万次迭代之前,结果实际上可以忽略不计,而我的应用程序将无法接近这样做。我将继续使用 Coord typedef 但会出于@meaning-matters 建议的一些原因删除该结构。根据记录,测试确实表明基于 int 的结构快了大约 30%,但是 0.0001 秒的 30% 并不是任何人都应该关心的。我仍然对实现更好的观点和反观点感兴趣。

最佳答案

这取决于你用它做什么。对于普通算术,吞吐量可以是相似的。整数延迟通常会少一些。在某些处理器上,GPR 的 L1 延迟比 FPR 更好。因此,对于许多测试,结果将相同或为整数计算提供较小的优势。在 32 位机器上,double 与 int64_t 计算的平衡将翻转。 (如果您正在编写 CPU vector 代码并且可以进行 16 位计算,那么使用整数会快得多。)

但是,在计算坐标/地址以将数据加载到寄存器或从寄存器中存储数据时,整数在 CPU 上显然更好。原因是加载或存储指令可以将整数操作数作为数组的索引,但不能将浮点操作数作为索引。要使用浮点坐标,您至少必须先转换为整数,然后加载或存储,因此它应该总是较慢。通常,还必须设置一些舍入模式(例如,floor() 操作),并且可能还需要一些重要的操作来考虑边缘模式,例如 CL_ADDRESS_REPEAT 寻址模式。与简单的 AND 运算相比,这可能是在整数上实现相同效果所需的全部操作,并且应该清楚整数是一种更便宜的格式。

在 GPU 上,它更强调浮点计算,并且可能不会在整数计算上投入太多(尽管它更容易),情况则完全不同。在那里,您可以期望纹理单元硬件直接使用浮点值来查找所需的数据。用于查找正确坐标的浮点算法内置于硬件中,因此是“免费的”(如果我们忽略能耗考虑),并且 GL 或 CL 等图形 API 是围绕它构建的。

一般来说,虽然浮点在图形 API 中无处不在,但对于采样数据的坐标系来说,浮点本身在数值上是较差的选择。它在图像的一个角落集中了过多的精度,可能会导致图像远角处的量化误差/不一致,从而导致线性采样的精度降低和意外的舍入效果。对于足够大的图像,图像中的某些像素可能无法通过坐标系寻址,因为不存在引用该位置的 float 。对于坐标系统来说,默认舍入模式(舍入到与偶数最接近的关系)可能是不可取的,因为线性过滤通常会将坐标放置在两个整数值之间的中间位置,从而导致偶数像素向上舍入,奇数像素向下舍入。这会导致像素重复,而不是最坏情况下的预期结果,在最坏的情况下,它们都是 hell 般的情况,并且步幅为 1。它的好处是它更容易使用。

定点坐标系允许在整个表面上保持一致的坐标精度和舍入,并避免这些问题。模数溢出很好地融入了一些常见的修边模式。精度是可以预测的。

关于ios - Objective C float 与 int、CGPoint 与基于自定义 int 的结构性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25371765/

相关文章:

ios - ld : library not found for -lMapView

ios - Xcode 4.6 无法为文本字段添加导出,因为弹出窗口中的 "connection"呈灰色

c - 读取不同流的独特功能

c - svm_light 的 svm_learn 命令不起作用

ios - 使用导航 Controller 在滑出面板中显示右键

javascript - 我如何知道某个应用程序是否已通过 Safari 安装在 iPhone 上

ios - 点击时更改 UITableView 中的单元格内容

ios - 切换标签时 UITabBarController 变黑

ios - swift 使用未解析的标识符'NSURLRequestUseProtocolCachePolicy'

c - VC 拒绝十六进制浮点常量