函数后向量赋值的性能
Performance of vector assignment after function
我使用以下代码:
MainLoop() {
for (int i = 0; i < length; i++) {
XMVector3Rotate(rays[i], orientation);
}
}
我有 fps 1900000,但是当我使用这个时:
MainLoop() {
for (int i = 0; i < length; i++) {
calculatedRays[i] = XMVector3Rotate(rays[i], orientation);
}
}
我的帧率 = 200。为什么?
当你这样做时:
XMVector3Rotate(rays[i], orientation);
我猜编译器内联了函数 - 并且看到,因为它的结果从未在任何地方分配 - 它实际上没有做任何事情,并完全删除了函数调用。它非常快,因为它实际上什么都不做。
但是,当您添加作业时:
calculatedRays[i] = XMVector3Rotate(rays[i], orientation);
突然之间,你开始做一堆内存读取和写入以及各种数学运算 - 所有这些都在以前被跳过了。
(您已经标记了此 XNA - 但这是一个C++函数。大多数C++编译器都可以并且将会像这样内联函数。标准 C# 编译器不能。
在第一个示例中,函数的结果立即被丢弃(未分配)。编译器足够聪明,可以感知到这一点,并省略了方法调用......
假设 XMVector3Rotate 返回 XNA Vector3 类型,这将是一个结构复制操作,性能相对昂贵。
在为 XBox360 优化我自己的 XNA 游戏时,我用ref
参数类型替换了许多此类操作,在繁重的循环中获得了非常明显的收益。
编辑:示例(来自内存)
Vector3 vec1 = something, vec2 = something, result;
Vector3.Add(ref vec1, ref vec2, out result);
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 使用赋值运算符重载从类中返回jobject
- C++数据文件、数组和计算赋值
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 标准库类型的赋值运算符的引用限定符
- 为数组赋值时是否存在性能差异
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 赋值运算符的性能
- 在 C++98 中实现移动构造函数和移动赋值运算符以获得更好的性能
- 初始化方法与构造函数加赋值的方法——性能有什么不同?(C++)
- 函数后向量赋值的性能