Как можно сделать метод быстрее? [закрыт]

100
16 февраля 2021, 18:30
Закрыт. На этот вопрос невозможно дать объективный ответ. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.

Закрыт 1 год назад.

Улучшить вопрос

Я новичок в c++

Есть вот такой метод

void FrameManager::LoadFrameData(char const *filename, const uint i_subIndex) {
std::array<float, 3> IGNORE{};
high_resolution_clock::time_point t1 = high_resolution_clock::now();
util::ReadFileMTR(i_subIndex, filename, IGNORE, m_vertices, m_textures, m_indices);
high_resolution_clock::time_point t2 = high_resolution_clock::now();
long long int duration = duration_cast<microseconds>(t2 - t1).count();
__android_log_print(ANDROID_LOG_ERROR, "LOAD FRAME INTERNAL METHOD", "LOAD FRAME INTERNAL METHOD ::: %s", std::to_string(duration).c_str());
std::vector<GLfloat> newVert;
newVert.resize(m_indices.size() * 3);
int count = 0;
for (unsigned int index : m_indices) {
    for (int k = 0; k < 3; ++k) {
        newVert[count] = m_vertices[index * 3 + k];
        count++;
    }
}
for (int i = 0; i < m_indices.size(); i++) {
    m_indices[i] = static_cast<unsigned int>(i);
}
m_vertices = newVert;
}

Как можно сделать метод еще быстрее?

Я имею ввиду, что мне не нравятся эти 2 цикла внизу... Как из можно заменить, чтоб ускорить это

Answer 1

Ваш первый цикл (двойной) использует диапазонную (range) версию с итерируемой переменной по значению. Т.е. даже изменяя index, вы не измените значения внутри массива m_indices:

for (unsigned int index : m_indices) {
    for (int k = 0; k < 3; ++k) {
        newVert[count] = m_vertices[index * 3 + k];
        count++;
    }
}

Во втором же вы как раз меняете значения в этом массиве:

for (int i = 0; i < m_indices.size(); i++) {
    m_indices[i] = static_cast<unsigned int>(i);
}

Т.к. обработка идёт вполне себе линейно (нет каких-либо перескоков), то эти циклы вполне себе можно объединить в один. Учитывая, что (во втором случае) нужен именно индекс элемента массива, общий цикл лучше сделать как раз на базе второго.

for (int i = 0; i < m_indices.size(); i++) {
    auto& index = m_indices[i];
    for (int k = 0; k < 3; ++k) {
        newVert[count++] = m_vertices[index * 3 + k];
    }
    index = static_cast<unsigned int>(i);
}

Ещё можно попробовать вариант разворачивания внутреннего цикла, хотя, оптимизатор может и сам что-то подобное сделать, я думаю.

for (int i = 0; i < m_indices.size(); i++) {
    auto& index = m_indices[i];
    newVert[count++] = m_vertices[index * 3 + 0];
    newVert[count++] = m_vertices[index * 3 + 1];
    newVert[count++] = m_vertices[index * 3 + 2];
    index = static_cast<unsigned int>(i);
}
READ ALSO
Почему происходит ошибка компилятора?

Почему происходит ошибка компилятора?

Вылазит MSB6006 " read access violation**IsRegistered** was nullptr VS 2019

86
Задержка в конце нескольких действий

Задержка в конце нескольких действий

Всем приветВ одной функции есть два действия

79
Как сделать так чтобы кнопка не оставляла отступов. Верстка

Как сделать так чтобы кнопка не оставляла отступов. Верстка

Учусь делать адаптивную верстку с помощью сетки gridУ меня получилось то что я хотел, но в итоге происходит смещение кнопки внутри блока

117