我看了一個來自 Tarodev 的關于代碼優化的視頻。在視頻的最后,我很震驚,因為我看到操作順序可以嚴重改變代碼速度。雖然我自己嘗試過,但我不明白這怎么可能?浮點 x 浮點 x 向量如何比浮點 x 向量 x 浮點或向量 x 浮點 x 浮點快 2 倍?
我從 GitHub 上安裝了 Tarodev 的專案并自己嘗試了一下。結果和視頻一樣。
編輯:
感謝所有這些很棒的答案。在您回答之后,我明白了原因并感到愚蠢:) 另外,我正在 Orhtej2 的建議中添加一個視頻存盤庫和示例代碼
uj5u.com熱心網友回復:
只是首先
someVector3 * someFloat
和
someFloat * someVector3
基本上都回來了
new Vector3(someVector3.x * someFloat, someVector3.y * someFloat, someVector3.z * someFloat)
所以基本上3個float * float操作 建構式呼叫Vector3
然后順序很重要,因為您的操作將按這樣的順序解決
在第一種情況下,你做
(float * float) * Vector3所以分步驟:
1. (float * float) => single float * operation => result: float 2. (float * Vector3) => 3 float * operations => result: Vector3在你做的那一秒
(float * Vector3) * float所以分步驟:
1. (float * Vector3) => 3 float * operations => result: Vector3 2. (Vector3 * float) => 3 float * operations => result: Vector3在第三個等價物你做
(Vector2 * float) * float所以在步驟
1. (Vector3 * float) => 3 float * operations => result: Vector3 2. (Vector3 * float) => 3 float * operations => result: Vector3
在第一種情況下,您只有 4 個*操作,而在其他兩種情況下,您有 6 個操作。
另外,在第二種和第三種情況下,您還實體化了一個額外Vector3的(第一次操作的結果),這也會消耗性能和記憶體。
uj5u.com熱心網友回復:
要將 afloat與 aVector3相乘,需要三個乘法。要將 a 乘以floata float,顯然只需要一個乘法。
當你這樣做時:
result = a * b * c;
這意味著:
result = (a * b) * c;
或更明確地說:
var tmp = a * b;
result = tmp * c;
假設aandb是浮點數并且c是一個向量。然后a * b執行一次乘法 ( floatby float) 并得到 a float,然后第二次操作執行三次乘法 ( floatby Vector3)。總共是四個乘法。
現在 supporta是一個向量,b并且c是浮點數。然后a * b執行三個乘法 ( Vector3by float) 并得到 a Vector3,然后第二個操作再次執行三個乘法 ( Vector3by float) 并得到 a Vector3。總共是六個乘法。
現在,編譯器可能會發現它們是等價的,并改為進行更便宜的四次乘法。但通常它并不容易看到這一點。通常它并不完全等同。例如,舍入和溢位在很大程度上取決于您執行操作的方式,并且編譯器不會弄亂它們,因為它可能會引入不準確性,因此它信任您并且完全按照您告訴它的去做。
uj5u.com熱心網友回復:
答案很簡單,按照我的例子:
Vector 是由多個值組成的物件:例如Vector3 v = new Vector3(1,2,3)
如果你為 Vector3 乘以一個數字,你正在做 3 次操作。
float n = 3.f
Vector3 v = new Vector3(1,2,3)
n*v結果是一個Vector3(1*n,2*n,3*n),所以一次乘法需要 3 次計算。在您正在做的第一種情況下按照您的示例進行計算n*n*v,因此計算 1次,總共 4 次計算。n*n 3n^2 * v
在第二種情況下,您正在執行n * v * n3 次計算n*v 3 次計算v*n,總共 6 次計算。
uj5u.com熱心網友回復:
Vector x Scalar1 x Scalar2 => (Vector x Scalar1) x Scalar2 =>
VectorTemp x Scalar2 = EndResult
總而言之,我們必須通過向量運算對標量進行兩次運算。表示向量長度乘法的 2 倍。
對比哪里
Scalar1 x Scalar2 x Vector = (Scalar1 x Scalar2) x Vector =>
Scalar3 x Vector = EndResult.
這里需要一個向量 x 標量操作。Scalar2 的 Scalar1 只是乘法
所以我想這里的關鍵思想是如果操作是可交換的,那么從最便宜的開始。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/456477.html
上一篇:沒有默認值的屬性初始化
下一篇:使用R測量變數中水平之間的一致性
