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

93ze6v8z  于 2023-02-26  发布在  其他
关注(0)|答案(3)|浏览(267)

这个标题的意思是,在某些情况下,编译完整个程序后,第一次执行需要大约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不再需要永恒。我把"解决"放在引号之间,因为我只想让我的程序在用户输入命令"退出"或"退出"时停止。
我再一次注意到我先编译,等到所有的东西都编译好了,然后才运行可执行文件。
我想知道我如何避免这种情况,因为即使我找到了一个部分解决方案,它对我来说并不完全理想。我还想知道是什么导致了这个问题。这就好像计算机不愿意运行可能永远不会停止的代码,害怕陷入无限循环xD。
感谢您对这篇文章的关注,并提前感谢任何试图回答这些问题的人。

    • 编辑:**

好吧,这是我目前为止尝试的,在阅读了答案之后:

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

我重新激活了卡巴斯基:

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

卡巴斯基里面可以禁用的东西很多,但是我觉得我尝试过的那些最有可能影响到这种情况,不过肯定是卡巴斯基的错,既然禁用了就解决了问题,我想我会尝试禁用更多的东西......
我还尝试了以下方法:

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

我将继续尝试改变我的方式是增加,试图进一步摆脱任何事情似乎是检查,如果我的程序停止或不xd ...我将编辑这与结果,因为我做的实验。
我继续努力寻找我能在卡巴斯基做些什么来解决这个问题
显然,禁用防火墙和"应用程序控制"功能解决了这个问题,但我想,让电脑在没有防火墙的情况下运行并不是一个很好的交易。
所以我重新启用了这两个功能,在"应用程序控制"中有一个"未知应用程序"选项,介于

  • 使用启发式分析来确定组(即它的"可信度")
  • 自动将应用程序放入以下组:[您可以在3个可信度组中选择的框]

然后有一个盒子写着:
确定组的最长时间:秒。<_> seconds.
有趣的是:此框中的秒数与程序开始运行前所用的时间直接相关。(此时间决不能大于秒数+~2)
但谜团还没有结束:
最后一行变灰了,当我关闭启发式分析的时候,测试框也被禁用了,这意味着当启发式分析被禁用的时候,就没有等待了,但是确实有,而且它仍然与插入到现在不可编辑的文本框中的时间有关!
哦,为什么防火墙的状态会很重要呢?按理说,停用"应用程序控制"会让这个问题消失,但不,防火墙和应用程序控制都必须被禁用!

7lrncoxx

7lrncoxx1#

乍一看,这看起来像是杀毒软件。每次它看到一个新的可执行文件正在运行时,它都会检查该文件是否有病毒。每当你重新编译时,它都必须再次检查该文件,因为它已经被更改了。
但是你对这个问题的“解决方案”让我很困惑!你所描述的似乎是不可能的。程序(或操作系统,或杀毒软件)怎么知道循环的数量是有限的呢?我认为这里需要进一步的实验。
首先,您可以尝试将可执行文件添加到防病毒软件的排除列表中。

snvhrwxg

snvhrwxg2#

虽然这不是你问题的答案,但肯定会引导你进入
1.下载procmon
1.在过滤器列表中添加进程名称(映像名称以...开头)
1.与procmon沿着运行程序的三个示例。每次运行后保存跟踪
1.第一次无暂停条件执行
1.后续执行
1.带暂停条件的执行
1.比较生成的轨迹

注意您可能会解决停机问题

8yparm6h

8yparm6h3#

我能够通过禁用应用程序中的Smart Control和Windows Defender中的浏览器控制来解决这个问题。

相关问题