CLS бьет по производительности - PullRequest
0 голосов
/ 04 сентября 2018

Этот код печатает желаемое число (4 здесь) совершенных чисел. Это мой старый код, который проверяет каждый номер, безупречен он или нет. Он работает нормально и заканчивается через 6 секунд, но если я ставлю cls перед проверкой каждого числа, это требует большого удара (около 100 секунд). Пожалуйста, расскажите мне теорию, лежащую в основе этого (почему несколько cls наносят удар по производительности).

Норми не отвечает, например: «Чувак, очевидно, что требуется удар, он каждый раз обновляет экран».

PS- Я знаю, что лучше не проверять совершенные числа, а генерировать их (по теореме Евклида-Эйлера)

IDE- DevC ++

#include <iostream>
#include <string>
using namespace std;

int choice, quan, i, a[50], number;
string schoice;

void startgame()
{
    choice = 3;
    quan = 4;
    system("cls");
    cout << "Hey guys, today we are gonna print different types of numbers\n";
    cout << "\nFollowing are some of the special numbers found in the known observable little universe of ours:- \n";
    cout << "\n1. Prime numbers\n2. Square numbers\n3. Perfect Numbers\n\n";
    cout << "Which ones do you wanna see?\n";
    //cin >> choice;
    cout << "\nCool! How many of them do you wanna see?\n";
    //cin >> quan;
}
void perfect()
{
    if (choice == 3)
    {
        int j = 0, y = 0, f = 0, number = 2;
        do
        {
            //This is the cls in question
            //system("cls");
            cout << "The number under inspection: " << number << "\n";
            f = 0;
            for (i = (number - 1); i >= 1; i--)
            {
                if (number % i == 0)
                {
                    f = f + i;
                }
            }

            if (f == number)
            {
                //cout<<number<<", ";
                a[j] = number;
                j = j + 1;
                y = y + 1;
            }
            number++;
        }
        while (y < quan);
        system("cls");
        cout << "\nHere are your " << quan << " perfect numbers starting from 1:-\n";
        j = 1;
        for (i = 0; i < quan; i++)
        {
            cout << a[i];
            if (j != quan)
            {
                cout << ", ";
            }
            j++;
        }
    }
}

int main()
{
    do
    {
        startgame();
        perfect();
        cout << "\n\nReturn to Main menu?(Y/N)\n";
        schoice = "N";
        //cin >> schoice;
    }
    while (schoice == "Y");
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Windows CreateProcess () довольно дорогая, намного дороже, чем Unix fork (). Более того, система («cls») - неэффективный, непереносимый хак. Вы не можете использовать его в системах, отличных от Windows. Вы можете использовать библиотеку ncurses, которая поддерживает манипуляции с консолью.

Для Windows через API консоли:

void clear() {
    COORD topLeft  = { 0, 0 };
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO screen;
    DWORD written;

    GetConsoleScreenBufferInfo(console, &screen);
    FillConsoleOutputCharacterA(
        console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    FillConsoleOutputAttribute(
        console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
        screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    SetConsoleCursorPosition(console, topLeft);
}
0 голосов
/ 04 сентября 2018

Когда вы запускаете систему ("cls"), вы создаете новый процесс и делаете это каждый раз, когда выбираете новый номер для проверки. Создание процесса - это дорогостоящая операция, и, что более важно, она вам не нужна, если все, что вам нужно, это обновить текущий номер на экране. Достаточно написать

cout << "The number under inspection: " << number << "\r";

cout.flush();

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

...