簡體   English   中英

優化小3d矢量結構的性能

[英]Optimize small 3d vector struct for performance

我是C ++的新手,有以下內容,讓我們稱之為問題。 在我的計算機模擬中,我使用矢量工作了很多。 我自己構建了一個表示向量的小結構,並想學習如何進行操作(例如normalize()函數更有效。另外,使用C ++的valarray有什么好處嗎?它似乎有一些用處方法預先實施。

我幾乎只使用normalize()函數和向量的加/減/乘。 由於我的所有向量只有三個元素,我對在項目中包含第三方庫猶豫不決。

這是我的結構:

struct vector_t {
    int _i, _j, _k;
    vector_t(int i, int j, int k) {
        _i = i;
        _j = j;
        _k = k;
    }
    vector_t() {}
    inline int getI() { 
        return _i; 
    }
    inline int getJ() { 
        return _j; 
    }
    inline int getK() { 
        return _k; 
    }
    inline void setI(int val) { 
        _i = val; 
    }
    inline void setJ(int val) { 
        _j = val; 
    }
    inline void setK(int val) { 
        _k = val; 
    }
    void normalize() {
        float length = sqrt(_i*_i + _k*_k + _j*_j);
        _i /= length;
        _j /= length;
        _k /= length;
    }
};

我的問題是:

  • 如何加速normalize()函數或者這是否是最有效的方法?
  • 在保持內存和計算機時間用量較低的同時實現這樣的結構/類的更多C ++方法是什么?
  • 我是否應該選擇超過我自己類型的valarray?

使用快速倒數平方根函數計算1 /長度,然后將每個元素乘以此因子。 除了比sqrt更快的功能之外,這還有3個相對便宜的乘法交易3個昂貴的除法運算:

struct vector_t {
    float _i, _j, _k;

    // ...

    void normalize() {
        float r_length = Q_rsqrt(_i*_i + _k*_k + _j*_j);
        _i *= r_length;
        _j *= r_length;
        _k *= r_length;
    }
};

注意:您可能想要考慮如何處理i == j == k == 0的病態情況。

這不會有很大的不同,但你的構造函數應該是這樣的:

vector_t(int i, int j, int k)
: _i(i), _j(j), _k(k)
{
}

為了優化,您應該查看SSE: http//www.cortstratton.org/articles/OptimizingForSSE.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM