Выделите больше оперативной памяти для исполняемого файла - PullRequest
0 голосов
/ 29 февраля 2020

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

Как я могу сказать своей IDE выделять больше ресурсов (столько, сколько он может) для моей программы?

Запуск ее в Выпуске x64 помогает, но не достаточно.

#include <cstddef>
#include <iostream>
#include <utility>
#include <vector>

int main() {
    using namespace std;

    struct library {
        int num = 0;

        unsigned int total = 0;

        int booksnum = 0;
        int signup = 0;
        int ship = 0;

        vector<int> scores;
    };

    unsigned int libraries = 30000; // in the program this number is read a file
    unsigned int books = 20000;     // in the program this number is read a file
    unsigned int days = 40000;      // in the program this number is read a file

    vector<int> scores(books, 0);
    vector<library*> all(libraries);

    for(auto& it : all) {
        it = new library;
        it->booksnum = 15000; // in the program this number is read a file
        it->signup = 50000;   // in the program this number is read a file
        it->ship = 99999;     // in the program this number is read a file
        it->scores.resize(it->booksnum, 0);
    }

    unsigned int past = 0;

    for(size_t done = 0; done < all.size(); done++) {
        if(!(done % 1000)) cout << done << '-' << all.size() << endl;
        for(size_t m = done; m < all.size() - 1; m++) {
            all[m]->total = 0;
            {
                double run = past + all[m]->signup;
                for(auto at : all[m]->scores) {
                    if(days - run > 0) {
                        all[m]->total += scores[at];
                        run += 1. / all[m]->ship;
                    } else
                        break;
                }
            }
        }
        for(size_t n = done; n < all.size(); n++)
            for(size_t m = 0; m < all.size() - 1; m++) {
                if(all[m]->total < all[m + 1]->total) swap(all[m], all[m + 1]);
            }
        past += all[done]->signup;
        if (past > days) break;
    }

    return 0;
}

этот цикл занимает так много времени ... Почему-то даже использование указателей на library не оптимизирует его

1 Ответ

4 голосов
/ 29 февраля 2020

RAM не делает вещи go быстрее. ОЗУ просто для хранения данных, которые использует ваша программа; если он не использует много, то ему не нужно много.

Точно так же, с точки зрения использования процессора, программа будет использовать все, что может (операционная система может изменить приоритет, и для этого есть API, но это, вероятно, не ваша проблема).

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

Вам нужно использовать инструмент под названием профилировщик, чтобы выяснить, где ваш код тратит свое время, а затем использовать эту информацию для ее оптимизации. Это особенно поможет вам в микрооптимизации, но для более крупных изменений алгоритма c (т. Е. Изменения того, как он работает полностью), вам нужно подумать о вещах на более высоком уровне абстракции.

...