How much performance difference when using string vs char array?

后端 未结 3 2154
一向
一向 2020-12-16 03:59

I have the following code:

char fname[255] = {0}
snprintf(fname, 255, \"%s_test_no.%d.txt\", baseLocation, i);

vs

std::stri         


        
3条回答
  •  情深已故
    2020-12-16 04:26

    Let's run the numbers:

    The code (I used PAPI Timers)

    main.cpp

    #include 
    #include 
    #include 
    #include "papi.h"
    #include 
    #include 
    #define TRIALS 10000000
    
    class Clock
    {
      public:
        typedef long_long time;
        time start;
        Clock() : start(now()){}
        void restart(){ start = now(); }
        time usec() const{ return now() - start; }
        time now() const{ return PAPI_get_real_usec(); }
    };
    
    
    int main()
    {
      int eventSet = PAPI_NULL;
      PAPI_library_init(PAPI_VER_CURRENT);
      if(PAPI_create_eventset(&eventSet)!=PAPI_OK) 
      {
        std::cerr << "Failed to initialize PAPI event" << std::endl;
        return 1;
      }
    
      Clock clock;
      std::vector usecs;
    
      const char* baseLocation = "baseLocation";
      //std::string baseLocation = "baseLocation";
      char fname[255] = {};
      for (int i=0;i(sum)/static_cast(TRIALS);
      std::cout << "Average: " << average << " microseconds" << std::endl;
    
      //compute variance
      double variance = 0;
      for(auto vecIter = usecs.begin(); vecIter != usecs.end(); ++vecIter)
      {
        variance += (*vecIter - average) * (*vecIter - average);
      }
    
      variance /= static_cast(TRIALS);
      std::cout << "Variance: " << variance << " microseconds" << std::endl;
      std::cout << "Std. deviation: " << sqrt(variance) << " microseconds" << std::endl;
      double CI = 1.96 * sqrt(variance)/sqrt(static_cast(TRIALS));
      std::cout << "95% CI: " << average-CI << " usecs to " << average+CI << " usecs" << std::endl;  
    }
    

    Play with the comments to get one way or the other. 10 million iterations of both methods on my machine with the compile line:

    g++ main.cpp -lpapi -DUSE_PAPI -std=c++0x -O3

    Using char array:

    Average: 0.240861 microseconds
    Variance: 0.196387microseconds
    Std. deviation: 0.443156 microseconds
    95% CI: 0.240586 usecs to 0.241136 usecs
    

    Using string approach:

    Average: 0.365933 microseconds
    Variance: 0.323581 microseconds
    Std. deviation: 0.568842 microseconds
    95% CI: 0.365581 usecs to 0.366286 usecs
    

    So at least on MY machine with MY code and MY compiler settings, I saw about a 50% slowdown when moving to strings. that character arrays incur a 34% speedup over strings using the following formula:

    ((time for string) - (time for char array) ) / (time for string)

    Which gives the difference in time between the approaches as a percentage on time for string alone. My original percentage was correct; I used the character array approach as a reference point instead, which shows a 52% slowdown when moving to string, but I found it misleading.

    I'll take any and all comments for how I did this wrong :)


    Edit: Compiled with GCC 4.8.4:

    string

    Average: 0.338876 microseconds
    Variance: 0.853823 microseconds
    Std. deviation: 0.924026 microseconds
    95% CI: 0.338303 usecs to 0.339449 usecs
    

    character array

    Average: 0.239083 microseconds
    Variance: 0.193538 microseconds
    Std. deviation: 0.439929 microseconds
    95% CI: 0.238811 usecs to 0.239356 usecs
    

    So the character array approach remains significantly faster although less so. In these tests, it was about 29% faster.

提交回复
热议问题