【问题标题】:First execution after compiling incredibly slow, unless it's "obvious" that all loops will halt编译后的第一次执行速度非常慢,除非“明显”所有循环都会停止
【发布时间】:2014-09-14 02:03:35
【问题描述】:

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

天气我从 IDE(代码::块)或文件资源管理器中运行它没有任何变化。

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

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

#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;
}

这个程序有前面提到的问题。但是,如果我做任何事情来保证程序将停止,那么问题就不再发生了。例如,声明这个:

int i=0;

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

i++;
if(i>4)
  Running=false;

不仅使程序在处理完 4 个命令后停止,它还“解决”了问题 - .exe 不再需要永远执行第一次。我将“solves”放在引号之间,因为我只希望程序在用户输入命令“quit”或“exit”时停止。

我再次注意,我先编译,等到所有内容都编译完毕,然后我才运行可执行文件。

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

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


编辑:

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

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

我重新激活了卡巴斯基:

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

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

我还尝试了以下方法:

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

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


我继续尝试在卡巴斯基中找到可以解决此问题的方法

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

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

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

然后有一个框说:

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

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

但谜团还没有结束:

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

哦,为什么防火墙的状态很重要?据说关闭“应用程序控制”才能解决这个问题,但不,防火墙和应用程序控制都必须禁用!

【问题讨论】:

  • 欢迎之后你可以试试 fflush(stdout)。
  • 卡巴斯基几乎就像是在某个沙箱中运行程序,随机输入,看看它是否有任何问题!为了排除这种情况,请尝试在输入无效时退出程序。
  • 当命令无效时,我尝试输入“Running=false”,等待仍然发生。但是,当命令为空时输入“Running=false”,不会进行任何等待!也许它像你说的那样在一个单独的环境中运行它,但根本没有给它任何输入!

标签: c++ performance loops codeblocks


【解决方案1】:

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

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

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

【讨论】:

  • 在正确的地方随机更改代码会导致与病毒签名不匹配。
  • 我尝试了几件事。我试着在这里列出它们,但它很难阅读,而且字符太少。所以我编辑了我的问题。
【解决方案2】:

虽然这不是你问题的答案,但肯定会引导你进入

  1. 下载procmon
  2. 在过滤器列表中添加您的进程名称(图像名称以 ... 开头)
  3. 与 procmon 一起运行程序的三个实例。每次运行后保存跟踪
    1. 第一次执行没有暂停条件
    2. 后续执行
    3. 在暂停条件下执行
  4. 比较结果跟踪

注意也许你会解决停机问题

【讨论】:

  • 谢谢,我试试看!
  • 我运行了 procmon 和(1 个实例)我的程序 (Test1.exe)。如何“在每次运行后保存跟踪”?
猜你喜欢
  • 2018-08-02
  • 1970-01-01
  • 2016-09-07
  • 2015-08-06
  • 2016-08-18
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多