编译速度非常慢后的第一次执行,除非“明显”所有循环都将停止

Sir*_*fus 5 c++ performance loops codeblocks

我用这个标题的意思是,在某些情况下,在构建整个程序之后,它的第一次执行将需要大约 25 秒才能开始(直到第一个 printf 显示在控制台上)。下一次执行几乎立即开始(应该如此)。添加/删除一个空格并再次编译,之后的第一次执行再次极其缓慢。

Weather 我从 IDE (Code::Blocks) 或文件资源管理器中运行它没有任何改变。

但这是“解决”问题的方法:

我写的程序有一个循环,它一直在等待用户输入:

#include <stdio.h>
#include <string>

using namespace std;

int main()
{
    printf("Welcome!\n");

    bool Running=true;

    do{

      char input[256], command[64];


      if(fgets(input, 256, stdin) == NULL || input[0]=='\n')
        continue;

      sscanf(input, "%s", command);

      string command_cppstr(command);

      if(command_cppstr == "help")
      {
        printf("\n");
        printf("help - displays this list\n");
        printf("exit / quit - exits this progam\n\n");
        continue;
      }
      if(command_cppstr == "exit" || command_cppstr == "quit")
      {
        Running = false;
        continue;
      }

      printf("Unrecognized command. Use command \"help\" for a list of commands and their descriptions.\n");

    }while(Running);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个程序有前面提到的问题。但是,如果我做一些保证程序会停止的事情中的任何一件,问题就不会再发生。例如,声明如下:

int i=0;
Run Code Online (Sandbox Code Playgroud)

并在 do while 循环中插入以下内容:

i++;
if(i>4)
  Running=false;
Run Code Online (Sandbox Code Playgroud)

不仅使程序在处理完 4 个命令后停止,它还“解决”了问题——.exe 不再需要永恒的第一次执行时间。我将“解决”放在引号之间,因为我只希望我的程序在用户通过键入命令“退出”或“退出”这样说时停止。

我再次注意到我先编译,等到一切都编译好,然后才运行可执行文件。

我想知道如何避免这种情况,因为即使我找到了部分解决方案,但对我来说并不完全理想。我也想知道是什么导致了这个问题。就好像计算机不愿意运行可能永远不会停止的代码,害怕陷入无限循环 xD。

感谢您对这篇文章的关注,并提前感谢任何试图回答这些问题的人。


编辑:

好的,这是我在阅读答案后到目前为止所尝试的:

  • 禁用卡巴斯基(我的防病毒软件) - 问题消失了。但这不是一个好的解决方案,因为我不喜欢没有防病毒软件的想法。

我重新激活了卡巴斯基:

  • 取消选中“使用启发式分析确实确定未知应用程序的[限制]组 - 无效
  • 禁用卡巴斯基的“应用程序控制” - 无效
  • 禁用卡巴斯基的“系统监控” - 无效
  • 禁用卡巴斯基的“Antiviros de MI”(似乎是聊天室相关的东西) - 没有效果
  • 在“漏洞验证设置”中禁用“验证范围” - 无效
  • 在卡巴斯基的应用程序控制中赋予程序可信状态 - 无效
  • 将程序放在卡巴斯基的卡巴斯基排除列表中 - 无效
  • 将 code::blocks 放在卡巴斯基的卡巴斯基排除列表中 - 无效

卡巴斯基有很多可以禁用的东西,但我认为我尝试过的东西最有可能影响这种情况。但这一定是卡巴斯基的错,因为禁用它解决了问题。我想我会尝试禁用更多的东西......

我还尝试了以下方法:

  • 用我声明的函数交换 i++(我通过引用和增量传递) - 无需等待
  • 用我声明的函数交换 i++(函数返回参数+1) - 无需等待
  • i 从 1 开始,在每个循环中乘以 2。当它大于 8 时,Running=false - 无需等待
  • i 从 0 开始,在每个循环中乘以 2。当它大于 8 时,Running=false - 等待(因为这并不能保证会停止 xD)

我将继续尝试改变我增加的方式,以尝试进一步摆脱任何似乎正在检查我的程序是否停止的东西 xD ...我将在进行实验时使用结果对其进行编辑。


我继续尝试在 Kaspersky 中寻找可以解决此问题的方法

显然,禁用防火墙和“应用程序控制”功能可以解决问题。但我想,让计算机在没有防火墙的情况下运行并不是一个很好的交易。

所以我重新启用了这两个功能,在“应用程序控制”中有一个“未知应用程序”的选项,介于

  • 使用启发式分析来确定组(即“可信度”)´
  • 自动将应用程序放入以下组:[您可以在 3 个可信赖组之间进行选择的框]

然后有一个盒子说:

确定组的最长时间:<_> 秒。

现在是有趣的部分:此框中的秒数与程序开始运行之前所花费的时间直接相关。(这个时间永远不会大于秒数+~2)

但谜团还没有结束:

最后一行变灰,当我停用启发式分析时,测试框被禁用,这表明当启发式分析被禁用时,将没有等待。但是还有!而且还是和现在不可编辑的文本框的插入时间有关!

哦,为什么防火墙的状态很重要?据说,停用“应用程序控制”将完全解决此问题,但不,防火墙和应用程序控制都必须禁用!

Ton*_*nyK 5

乍一看,这看起来像防病毒软件。每次看到正在运行的新可执行文件时,它都会检查该文件是否有病毒。每当您重新编译时,它都必须再次检查文件,因为它已更改。

但是您对问题的“解决方案”让我感到困惑!你所描述的似乎是不可能的。程序(或操作系统或防病毒软件)如何知道循环次数是有限的?我认为这里有必要进行进一步的实验。

首先,您可以尝试将可执行文件添加到防病毒软件的排除列表中。发生什么了?