Uploaded image for project: 'C++ Standard Library'
  1. C++ Standard Library
  2. STDCXX-231

std::getline from <string> header is rather slow

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 4.1.2, 4.1.3, 4.1.4, 4.2.0
    • 4.2.1
    • 21. Strings
    • None
    • Inefficiency

    Description

      Moved from the Rogue Wave bug tracking database:

      ****Created By: leroy @ Jan 25, 2001 03:20:01 PM****
      
      
      Environment
        Compiler : SUNPRO 4.2
        OS : Solaris 2.5.1
        SCL : 1.3.0 (Summer-1999)
        Tools : 7.1.0 (Summer-1999) --> Use only for RWBench
      
      Command line option :
        for debug : 
        CC -xildoff +w +p -g -o Test_dbg.exe test.cc -DRWDEBUG=1 \
      -I/opt/RogueWave/Summer-1999/workspaces/SOLARIS251/SUNPRO42/11s \
      -I/opt/RogueWave/Summer-1999/workspaces/SOLARIS251/SUNPRO42/11s/include \
      -I. -L/opt/RogueWave/Summer-1999/workspaces/SOLARIS251/SUNPRO42/11s/lib -Bstatic -ltls11s -lstd11s -Bdynamic
      
        for release :
      CC -xildoff +w +p -fast -o Test_release.exe test.cc \
      -I/opt/RogueWave/Summer-1999/workspaces/SOLARIS251/SUNPRO42/8s \
      -I/opt/RogueWave/Summer-1999/workspaces/SOLARIS251/SUNPRO42/8s/include \
      -I. -L/opt/RogueWave/Summer-1999/workspaces/SOLARIS251/SUNPRO42/8s/lib -Bstatic -ltls8s -lstd8s -Bdynamic
       (Uploaded file: 997149-test.cc)
                                                                           
      **** Entered By: Web @ Thursday, January 25, 2001 2:41:42 AM **** 
      Location of uploaded file: 
      http://thoth.bco.roguewave.com/uploads/997149-test.cc
      
      View all uploaded files for this incident: 
      http://webdev.roguewave.com/admin/tsvw/index.cfm?IncidentID=997149
      
      **** Entered By: Web @ Thursday, January 25, 2001 2:44:56 AM **** 
      #web
      Please find my test case at the end of the note
      
      Environment
        Compiler : SUNPRO 4.2
        OS : Solaris 2.5.1
        SCL : 1.3.0 (Summer-1999)
        Tools : 7.1.0 (Summer-1999) --> Use only for RWBench
      
      Command line option :
        for debug : 
        CC -xildoff +w +p -g -o Test_dbg.exe test.cc -DRWDEBUG=1 \
      -I/opt/RogueWave/Summer-1999/workspaces/SOLARIS251/SUNPRO42/11s \
      -I/opt/RogueWave/Summer-1999/workspaces/SOLARIS251/SUNPRO42/11s/include \
      -I. -L/opt/RogueWave/Summer-1999/workspaces/SOLARIS251/SUNPRO42/11s/lib -Bstatic -ltls11s -lstd11s -Bdynamic
      
        for release :
      CC -xildoff +w +p -fast -o Test_release.exe test.cc \
      -I/opt/RogueWave/Summer-1999/workspaces/SOLARIS251/SUNPRO42/8s 
      -I/opt/RogueWave/Summer-1999/workspaces/SOLARIS251/SUNPRO42/8s/include \
      -I. -L/opt/RogueWave/Summer-1999/workspaces/SOLARIS251/SUNPRO42/8s/lib -Bstatic -ltls8s -lstd8s -Bdynamic
      
      #Code
      #include <string>
      #include <fstream.h>
      #include <iostream.h>
      #include <rw/bench.h>
       
       
      class std_string_getline : public RWBench
      {
        public:
         std_string_getline() {;}
       
         void doLoop(unsigned long n);
         void idleLoop(unsigned long n);
         void what(ostream& os) const { os << "Standard String Getline : " << endl;}
      };
       
      class classic_getline : public RWBench
      {
        public:
          classic_getline() {;}
       
          void doLoop(unsigned long n);
          void idleLoop(unsigned long n);
          void what(ostream& os) const { os << "Classic Getline : " << endl;}
      };
       
      int
      main(int argc, char** argv)
      {
       
        std_string_getline test_std_string;
        test_std_string.parse(argc, argv);
        test_std_string.go();
        test_std_string.report(cout);
       
        classic_getline test_classic_getline;
        test_classic_getline.parse(argc, argv);
        test_classic_getline.go();
        test_classic_getline.report(cout);
      }
       
      void
      std_string_getline::doLoop(unsigned long n)
      {
        while (n--)
        {
          ifstream toRead(__FILE__);
          string line;
          line.reserve(512);
       
          while (!(toRead.eof()))
          {
            getline(toRead, line, '\n');
          }
        }
      }
       
      void
      std_string_getline::idleLoop(unsigned long n)
      {
        while (n--)
        {
          ifstream toRead(__FILE__);
          string line;
          line.reserve(512);
        }
      }
       
      void
      classic_getline::doLoop(unsigned long n)
      {
        while (n--)
        {
          ifstream toRead(__FILE__);
          char cLine[512];
          string line;
          line.reserve(512);
       
          while (!(toRead.eof()))
          {
            toRead.getline(cLine, 512);
            line = cLine;
          }
        }
      }
       
      void
      classic_getline::idleLoop(unsigned long n)
      {
        while (n--)
        {
          ifstream toRead(__FILE__);
          char cLine[512];
          string line;
          line.reserve(512);
        }
      }
      
      #EndCode                
      
      There appears to be something to this.  I ran the program and here is the output:
      
      Sun C++ 
      
      Standard String Getline : 
      
      Iterations:                 1
      Inner loop operations:      1000
      Total operations:           1000
      Elapsed (user) time:        18.18
      Operations per second:      55.0055
      
      Sun C++ 
      
      Classic Getline : 
      
      Iterations:                 5
      Inner loop operations:      1000
      Total operations:           5000
      Elapsed (user) time:        4.67
      Kilo-operations per second: 1.07066
      

      Attachments

        1. stdcxx-231.patch
          1 kB
          Travis Vitek

        Activity

          People

            vitek Travis Vitek
            sebor Martin Sebor
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Time Tracking

                Estimated:
                Original Estimate - 4h Original Estimate - 4h
                4h
                Remaining:
                Time Spent - 7.5h Remaining Estimate - 0.5h
                0.5h
                Logged:
                Time Spent - 7.5h Remaining Estimate - 0.5h
                7.5h