VS 2017 и 2019 работают с ++ очень медленно - PullRequest
3 голосов
/ 12 января 2020

Я начал с небольшой программы в python, но потребовалось много времени, чтобы пройти через нее, поэтому я переключился на c ++. У меня нет опыта работы с этим конкретным c языком (хотя и много кодируется в c#), и я начал в веб-редакторе: https://www.onlinegdb.com/online_c++_compiler.

Мой код C ++ :

clock_t start, end;

/* Recording the starting clock tick.*/
start = clock();

int R = 0;
int x = 0;

for (R = 6; R <= 10000; R = R + 2) {
    int X_min = ceil(0.5 * sqrt(2) * R);
    int N_pairs = 0;

    for (x = X_min; x < R; x++) {
        float y = sqrt(pow(R, 2) - pow(x, 2));

        if (rint(y) == y) {
            N_pairs = N_pairs + 1;
        }
    }

    if (N_pairs >= 4) {
        //cout << R << ", " << N_pairs;
        //cout << "\n";
    }
}

end = clock();

//Calculating total time taken by the program. 
double time_taken = double(end - start) / double(CLOCKS_PER_SEC);
cout << "Time taken by program is : " << time_taken;
cout << " sec " << endl;

//cout << "1" << "|" << "2" << "|" << "3 \n";
//cout << "4" << "|" << "5" << "|" << "6 \n";
//cout << "7" << "|" << "8" << "|" << "9 \n";

Все это работало хорошо, однако веб-редактор, похоже, имеет встроенную максимальную временную границу, поэтому в этот момент я решил перенести ее в Visual Studio.

Я скопировал, вставил код и запустил его:

  • веб-редактор занял 0,272273 SE c для завершения кода
  • Visual Studio занял 2,446 SE c чтобы запустить его.

Я пытался обновить VS с версии 2017 до версии 2019, но это не имело никакого эффекта.

Почему VS запускает VS так долго код?? и как я могу это исправить?

Ответы [ 2 ]

3 голосов
/ 12 января 2020

Основная проблема в том, что VC ++ не поддерживает rint(float) вызов:

    movaps  xmm0, xmm6
    call    rint
    ucomisd xmm0, xmm6

ссылка на Godbolt

You можно ожидать хорошего ускорения, заменив rint(y) на «ручное» округление:

Изменить

        if (rint(y) == y) {

На

        if (int(y+0.5) == y) {

На моем компьютере с 0,8 с до 0,04 с (компиляция с /O2 /fp:fast)

Также вам необходимо использовать N_pairs вне l oop в противном случае a (хорошо) компилятор может все оптимизировать.

1 голос
/ 17 января 2020

Первое правило оптимизации: производительность неверной программы не имеет значения.

Похоже, вы ищете целочисленные решения x^2 + y^2 = R^2. Однако использование float типа данных для промежуточного хранилища приводит к множеству ложных срабатываний. Перемещение N_pairs из l oop (чтобы предотвратить полное удаление этого l oop, как уже отмечалось @rustyx, и для подсчета всех пар) приводит к 7886 парам; с double: 5681.

Последнее число также соответствует полностью целочисленной проверке, что немного быстрее (в моей системе 21 мс). Вот мой код:

#include <iostream>
#include <chrono>

int main()
{
    auto t = std::chrono::high_resolution_clock::now();
    int N_pairs = 0;
    double d = 0.5 * sqrt(2);
    for (int R = 6; R <= 10000; R = R + 2) {
        int X_min = ceil(d * R);

        for (int x = X_min; x < R; x++) {
            int y = sqrtf(R * R - x * x);
            if(x*x + y*y == R*R) {
                N_pairs = N_pairs + 1;
            }
        }
    }
    std::cout << "Time taken by program is: " 
        << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - t).count() 
        << " ms" << std::endl;
    std::cout << "N_pairs: " << N_pairs << std::endl; // with float: 7886; with double or int: 5681
return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...