C++ C++;优化

C++ C++;优化,c++,optimization,C++,Optimization,我正在做一些实时的事情,我需要很大的速度。但在我的代码中,我有: float maxdepth; uint32_t faceindex; for (uint32_t tr_iterator = 0; tr_iterator < facesNum-1; tr_iterator++) { maxdepth = VXTrisDepth[tr_iterator]; faceindex = tr_iterator; uint32_t tr_literator = 3*tr_

我正在做一些实时的事情,我需要很大的速度。但在我的代码中,我有:

float maxdepth;
uint32_t faceindex;

for (uint32_t tr_iterator = 0; tr_iterator < facesNum-1; tr_iterator++)
{
    maxdepth = VXTrisDepth[tr_iterator];
    faceindex = tr_iterator;
    uint32_t tr_literator = 3*tr_iterator;
    uint32_t facelindex = 3*faceindex;
    for (uint32_t tr_titerator = tr_iterator+1; tr_titerator < facesNum; tr_titerator++)
    {
        float depth = VXTrisDepth[tr_titerator];
        if (depth > maxdepth)
        {
            maxdepth = depth;
            faceindex = tr_titerator;
        }
    }
    Vei2 itmpx = trs[tr_literator+0];
    trs[tr_literator+0] = trs[facelindex+0];
    trs[facelindex+0] = itmpx;
         itmpx = trs[tr_literator+1];
    trs[tr_literator+1] = trs[facelindex+1];
    trs[facelindex+1] = itmpx;
         itmpx = trs[tr_literator+2];
    trs[tr_literator+2] = trs[facelindex+2];
    trs[facelindex+2] = itmpx;
    float id   = VXTrisDepth[tr_iterator];
    VXTrisDepth[tr_iterator] = VXTrisDepth[faceindex];
    VXTrisDepth[faceindex] = id;
}
float-maxdepth;
uint32_t faceindex;
对于(uint32_t tr_iterator=0;tr_iterator最大深度)
{
最大深度=深度;
faceindex=tr_滴定仪;
}
}
Vei2 itmpx=trs[tru读写器+0];
trs[tru读写器+0]=trs[facelindex+0];
trs[facelindex+0]=itmpx;
itmpx=trs[tru读写器+1];
trs[tru读写器+1]=trs[facelindex+1];
trs[facelindex+1]=itmpx;
itmpx=trs[tru读写器+2];
trs[tru读写器+2]=trs[facelindex+2];
trs[facelindex+2]=itmpx;
float id=VXTrisDepth[tr_迭代器];
VXTrisDepth[tr_迭代器]=VXTrisDepth[faceindex];
VXTrisDepth[faceindex]=id;
}
VXTrisDepth只是一个浮点数组,faceindex是一个uint32_t,是一个大数字,trs是一个Vei2数组,Vei2只是一个整数2D向量。
问题是,当我们在facenum中有类似16074的东西时,这个循环需要700毫秒才能在我的计算机上运行,这太多了,有优化的想法吗?

我已经重写了一点,以了解您真正在做什么

警告所有代码未经测试

float-maxdepth;
uint32_t faceindex;
对于(uint32_t tr_iterator=0;tr_iterator
现在它看起来像两个数组中的一个,是O(N^2),难怪它感觉很慢

有多种方法可以对此进行排序

  • 外部索引,创建一个长度为facesNum的数组,从零到facesNum-1初始化,并使用索引将其排序为深度。然后根据索引数组对2个原始数组重新排序
  • 索引和键的外部对,为了便于使用std::pair,对其进行排序,然后对原始的2个数组重新排序
  • 对这两个数组进行排序,就像它是一个轻微的黑客攻击一样。使用std::swap,您需要专门化一个类型,以便它可以被误用来交换2个数组。不需要额外的存储空间
让我们尝试使用外部对的简单版本

我们需要三个阶段

  • 生成辅助数组O(N)
  • 排序帮助器数组O(N lg N)
  • 重新排列原始数组O(N)
还有一些代码

// make helper array
using hPair = std::pair<float, int>; // order is important
std::vector<hPair> helper;
helper.reserve(numFaces);

for (int idx = 0; idx < facesNum; idx++)
  helper.emplace_back(VXTrisDepth[idx], idx);

// sort it using std::pair's operator < or write your own
std::sort(helper.begin(), helper.end());

// reorder the SOA arrays
auto vx = std::begin(VXTrisDepth);
for (auto& help : helper) {
  int tr_literator = help.second;
  std::swap(trs[tr_literator+0], trs[facelindex+0]);
  std::swap(trs[tr_literator+1], trs[facelindex+1]);
  std::swap(trs[tr_literator+2], trs[facelindex+2]);

  *vs++ = help.first; // we already have the sorted depth in helper.
  //std::swap(VXTrisDepth[tr_iterator], VXTrisDepth[faceindex]);
}    
//生成帮助器数组
使用hPair=std::pair;//秩序很重要
std::矢量辅助器;
助手保留区(numFaces);
对于(intidx=0;idx

记住要测试它是否仍然有效。。。您已经有了一个测试框架,对吗?

您是否尝试了
-O3
开关?尝试对具有tmp变量的整个部分使用std::swap可能的优化是将第二个循环移出第一个循环,即“第二个”循环为每个tr_titerator构建maxdepth和faceindex向量,第一个循环使用它而不是;您正在进行优化,对吗?旁注:我发现
tr_迭代器
tr_读写器
tr_滴定器
(或
faceindex
facelindex
)的名称非常混乱,因此我会拒绝代码审查。乍一看名称更清晰可能更有利于维护。@MMBCProductions如果您还告诉我们代码的实际功能(用人类的话),它可能会帮助我们找到优化。
// make helper array
using hPair = std::pair<float, int>; // order is important
std::vector<hPair> helper;
helper.reserve(numFaces);

for (int idx = 0; idx < facesNum; idx++)
  helper.emplace_back(VXTrisDepth[idx], idx);

// sort it using std::pair's operator < or write your own
std::sort(helper.begin(), helper.end());

// reorder the SOA arrays
auto vx = std::begin(VXTrisDepth);
for (auto& help : helper) {
  int tr_literator = help.second;
  std::swap(trs[tr_literator+0], trs[facelindex+0]);
  std::swap(trs[tr_literator+1], trs[facelindex+1]);
  std::swap(trs[tr_literator+2], trs[facelindex+2]);

  *vs++ = help.first; // we already have the sorted depth in helper.
  //std::swap(VXTrisDepth[tr_iterator], VXTrisDepth[faceindex]);
}