This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器:fprintf 在附加模式下非常慢

Guru**** 3001220 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/922269/compiler-fprintf-in-append-mode-very-slow

工具/软件:TI C/C++编译器

您好!

我将使用 Code Composer Studio V10并借助 TI 优化的 ARM 编译器开发嵌入式软件。 我正在尝试使用 TI 提供的 CI/O 实用程序(非常棒)、该实用程序使用来自 Digital Spectrum 的调试探针 XDS200针对 Hercules TMS570LS09目标提供。

一切都很好、如果我尝试写入已使用 fprintf 或 fputc 在附加模式下打开的文件、速度非常慢、几乎无法使用。 实际上、在文件中写入一个字符几乎需要500ms。 如果文件在写入模式下打开、则速度会提高100倍以上。

我已经尝试使用以下代码行更改缓冲模式:
   char buffer[256];        
   setvbuf (fp、buffer、_IOFBF、sizeof (buffer)/ sizeof (buffer[0]));
但它不会显著提高性能。

有人知道为什么两种打开文件的方式之间的速度差别很大吗? 是否有方法提高在附加模式下打开的文件的写入速度?

感谢您的帮助

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请在 TI ARM 编译器手册中搜索 标题 为 C I/O 函数的子章节。  请注意、诸如 fopen 的 C I/O 函数如何要求代码在 Code Composer Studio 的控制下运行。  这是因为您的主机操作系统处理最低级别的输入/输出操作。   

    在主机系统上尝试类似的程序。  如果您在使用附加模式时看到类似的性能差异,则问题出在主机系统中的某个位置。  请告诉我您看到的内容。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的乔治:

    我尝试测量折页函数的性能、一次使用在 TMS570LS09上运行的 TI ARM 编译器与 code composer studio 进行编译、一次使用 gcc 编译并直接在 Windows 主机上运行。

    静态空 file_write_method1 (空)
    {
       文件*fp;
       int charcount = 0;

       if ((fp = fopen ("method1.txt"、"W"))!= NULL)
       {

           对于(charcount = 0;charcount < 20000;charcount++)
           {
               fputc ((charcount % 92)+ 0x30、fp);
           }

           fputc ('\n'、fp);/*在末尾仍然... *

           fclose (FP);
       }
    }

    静态空 file_write_method2 (空)
    {
       文件*fp;
       int charcount = 0;

       if ((fp = fopen ("method2.txt"、"A"))!= NULL)
       {

           对于(charcount = 0;charcount < 200;charcount++)
           {
               fputc ((charcount % 92)+ 0x30、fp);
           }

           fputc ('\n'、fp);/*在末尾仍然... *

           fclose (FP);
       }
    }

    目标 输出数量 方法1执行 方法2执行时间
    主机 20. 16毫秒 84毫秒
    主机 20'000 38毫秒 116毫秒
    主机 2'000'00 1.46秒 2.22秒
    目标 2. 550毫秒 1.5秒
    目标 20. 530毫秒 7.9秒
    目标 200 580毫秒 65秒
    目标 20'000 19秒 ?

    请注意、不同试验的时间可能会有所不同。

    在执行之前、删除了 method1.txt 和 method.txt 这两个函数、以便 fopen 创建两个文件。

    目标上方法2的时序如此之慢、以至于它无法使用、而且我认为这不是主机问题、因为在主机上运行时、两种方法在执行时间方面都更加接近。 有什么想法、问题可能是什么?

    感谢你的帮助

    路易

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想我理解为什么 fprintf 这么慢。

    当文件在附加模式下打开时、每次我们要使用 fputc 写入字符时、文件指针都会使用 fseek 移动到文件的末尾。 无论出于何种原因、即使文件几乎为空、此操作也非常缓慢。

    在我的用例中、fprintf 使用 fputc 逐一写入每个字符、这使得它非常慢。 权变措施是使用 fputc 而不是 fputc、实际上、此函数将编写一个完整的字符串、并且文件指针只应移动一次到文件末尾。 因此、使用此函数时、我们将具有与在写入模式下打开的文件中进行写入几乎相同的性能。

    下面是与上面相同的代码、它可以执行我想要的操作、并且速度不会太慢:

    静态空 file_write_Method3 (空)
    {
       char buffer[2048]={'\0'};
       文件*fp;
       int charcount = 0;

       对于(charcount = 0;charcount < 2000;charcount++)
       {
           Buffer[charcount]=(char)((charcount % 92)+ 0x30);
       }

       Buffer[charcount]='\n';/*在末尾仍然... *

       如果((fp = fopen ("Method3.txt"、"a"))!= NULL)
       {
           fputs (buffer、fp);
           fclose (FP);
       }
    }