Russian Qt Forum

Qt => Общие вопросы => Тема начата: Andrew Vladoff от Май 14, 2010, 15:53



Название: Количество строк в текстовом файле
Отправлено: Andrew Vladoff от Май 14, 2010, 15:53
Как узнать количество строк в текстовом файле?


Название: Re: Количество строк в текстовом файле
Отправлено: spectre71 от Май 14, 2010, 15:58
Как узнать количество строк в текстовом файле?

Посчитать.


Название: Re: Количество строк в текстовом файле
Отправлено: niXman от Май 14, 2010, 16:30
Код
C++ (Qt)
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <stdexcept>
 
/***************************************************************************/
 
int string_count(const std::string& fname) {
  std::ifstream file(fname);
  if ( !file ) {
     throw std::runtime_error("can`t open file: " + fname);
  }
  return std::distance(
     (std::istream_iterator<std::string>(file)),
     (std::istream_iterator<std::string>())
  );
}
 
int main(int argc, const char** argv) {
 
  std::cout << "strings = " << string_count("main.cpp") << std::endl;
 
  std::cin.get();
  return 0;
}
 
/***************************************************************************/
 


Название: Re: Количество строк в текстовом файле
Отправлено: garryHotDog от Май 14, 2010, 16:43
Можно вот так:
Код
C++ (Qt)
QTextStream stream(&file);
// количество строк.
quint64 linecount=0x00;
QString line;
do
{
    line = stream.readLine();
    // увеличим счетчик строк
    if(!line.isNull()) { linecount++;}
} while (!line.isNull());
 


Название: Re: Количество строк в текстовом файле
Отправлено: Igors от Май 14, 2010, 18:04
Код
C++ (Qt)
  return std::distance(
     (std::istream_iterator<std::string>(file)),
     (std::istream_iterator<std::string>())
  );
 
А что будет если текстовик пришел с др. платформы? Напр сейчас Вы на Linux, а концы строк в файле 10 (Mac) или 13,10 (Вындоуз)?


Название: Re: Количество строк в текстовом файле
Отправлено: niXman от Май 14, 2010, 18:12
в STL, символы завершения строки, зависят от конкретной ОС.
естественно, что ни std::ifstream, ни std::istream_iterator, по умолчанию не выполняют никакой проверки на сей предмет.
при необходимости можно немного допилить.


Название: Re: Количество строк в текстовом файле
Отправлено: Igors от Май 14, 2010, 18:21
в STL, символы завершения строки, зависят от конкретной ОС.
естественно, что ни std::ifstream, ни std::istream_iterator, по умолчанию не выполняют никакой проверки на сей предмет.
при необходимости можно немного допилить.
Если не затруднит - допилите. Утилитка для создания текстовиков с разными концами строк здесь http://www.prog.org.ru/topic_11267_30.html (http://www.prog.org.ru/topic_11267_30.html) (последний пост)


Название: Re: Количество строк в текстовом файле
Отправлено: niXman от Май 14, 2010, 18:33
в STL, символы завершения строки, зависят от конкретной ОС.
естественно, что ни std::ifstream, ни std::istream_iterator, по умолчанию не выполняют никакой проверки на сей предмет.
при необходимости можно немного допилить.
Если не затруднит - допилите. Утилитка для создания текстовиков с разными концами строк здесь http://www.prog.org.ru/topic_11267_30.html (http://www.prog.org.ru/topic_11267_30.html) (последний пост)
то что приатачено тут? : http://www.prog.org.ru/index.php?topic=11267.msg72661#msg72661


Название: Re: Количество строк в текстовом файле
Отправлено: Igors от Май 14, 2010, 18:44
то что приатачено тут? : http://www.prog.org.ru/index.php?topic=11267.msg72661#msg72661
да


Название: Re: Количество строк в текстовом файле
Отправлено: kambala от Май 14, 2010, 22:17
Код
C++ (Qt)
QFile f("in.txt");
int n = 0;
if (f.open(QIODevice::ReadOnly | QIODevice::Text)
  n = QTextStream(&f).readAll().split('\n').count();
 


Название: Re: Количество строк в текстовом файле
Отправлено: niXman от Май 14, 2010, 22:42
Код
C++ (Qt)
QFile f("in.txt");
int n = 0;
if (f.open(QIODevice::ReadOnly | QIODevice::Text)
  n = QTextStream(&f).readAll().split('\n').count();
 
а если объем файла 20ГБ или более? тогда что, мейнфрейм (http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B9%D0%BD%D1%84%D1%80%D0%B5%D0%B9%D0%BC) покупать? ;D


Название: Re: Количество строк в текстовом файле
Отправлено: garryHotDog от Май 14, 2010, 22:51
split('\n') - более длительная операция, потому что происходит поиск 2ух байт, я думаю обычный пошаговый проход!


Название: Re: Количество строк в текстовом файле
Отправлено: Авварон от Май 14, 2010, 23:05
Код:
QFile f("in.txt");
int n = -1;
if (f.open(QIODevice::ReadOnly | QIODevice::Text) {
   QByteArray buf;
   do {
       buf = f.readLine();
       n++;
   } while (!buf.isEmpty());
}
мож так?


Название: Re: Количество строк в текстовом файле
Отправлено: ритт от Май 14, 2010, 23:58
Код:
int n = 0;
QFile file("in.txt");
if (file.open(QFile::ReadOnly)) {
    char buf[1024]; // либо QVarLengthArray - для произвольной длины строки
    qint64 lineLength;
    forever {
        lineLength = file.readLine(buf, sizeof(buf));
        if (lineLength > 0)
            ++n;
        else if (lineLength == -1)
            //###
        else
            break;
   }
}


Название: Re: Количество строк в текстовом файле
Отправлено: sendevent от Май 15, 2010, 03:12
чето зацепило  :D
дисклаймер: надеюсь, все мы понимаем, что одноразовый тест - не предмет для обсуждения красот и правильностей кода. для тех, хто не понимает - у меня уже готовы куклы вуду, осталось вписать ник  ;)
а серьезно - если вдруг сотворил дето косяк, пошатнувший основы вселенной - в лс! а то тут начнется...

Код:
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <stdexcept>

#include <QtGlobal>
#include <QTime>
#include <QFile>
#include <QTextStream>
#include <QStringList>

using namespace std;

/**
** sendevent's variant.
** i think it's possible to get a correct "endl" from the Qt, but idk how =(
*/
#if defined(Q_OS_MAC)
    #define CURRENT_LINES_DELEMITER "\r"
#elif defined(Q_OS_WIN)
    #define CURRENT_LINES_DELEMITER "\r\n"
#elif defined(Q_OS_LINUX)
    #define CURRENT_LINES_DELEMITER "\n"
#else
    message("define your lines ending!")
#endif //-- Q_OS_MAC|Q_OS_WIN

unsigned long sendevent( const char* pFileName )
{
    QFile file( pFileName );
    unsigned long res = 0;
    if( file.open( QIODevice::ReadOnly ) )
    {
        res = file.readAll().count( CURRENT_LINES_DELEMITER );
        file.close();
    }

    return res;
}

/**
** nixMan's variant.
** google it yourselth how to change it for compille with MS VS
** and ignore whitespaces ;-)
*/
unsigned long nixMan( const char* pFileName ) {
   ifstream file( pFileName );
   if ( !file ) {
      throw runtime_error( string( "can`t open file: " ).append( pFileName ) );
   }
   return (unsigned long)distance(
      (istream_iterator< string >(file)),
      (istream_iterator< string >())
   );
}

/**
** garryHotDog's lines counter
*/
unsigned long garryHotDog( const char *pFileName )
{
    QFile file( pFileName );
    unsigned long linecount=0x00;
   
    if( file.open( QIODevice::ReadOnly ) )
    {
        QTextStream stream( &file );
        // количество строк.
       
        QString line;
        do
        {
            line = stream.readLine();
            // увеличим счетчик строк
            if(!line.isNull()) { linecount++;}
        } while (!line.isNull());
       
        file.close();
    }
   
    return linecount;
}

unsigned long kambala( const char *pFileName )
{
    unsigned long n = 0;
    QFile f( pFileName );
    if ( f.open(QIODevice::ReadOnly | QIODevice::Text ) )
    {
        n = QString( f.readAll() ).split(CURRENT_LINES_DELEMITER).count();
        f.close();
    }

    return n;
}

unsigned long konstantin( const char *pFileName )
{
    unsigned long n = 0;
    QFile file( pFileName );
    if ( file.open( QFile::ReadOnly ) )
    {
        char buf[1024]; // либо QVarLengthArray - для произвольной длины строки
        qint64 lineLength;
        forever
        {
            lineLength = file.readLine(buf, sizeof(buf));
            if (lineLength > 0)
            {
                ++n;
            }
            else if (lineLength == -1)
            {
                break;
            }
        }
        file.close();
    }

    return n;
}


/**
** test stuff
*/

typedef unsigned long ( *pointer2function )( const char* );
const char* callTestFunction( pointer2function pFunc, const char *pArg )
{
    QTime time;
    unsigned long iLinesCount, iMsecs;
   
    time.start();
    iLinesCount = pFunc( pArg );
    iMsecs = time.elapsed();
   
    QString strRes( "%1 lines were found at %2 ms" );
    return strRes.arg( iLinesCount ).arg( iMsecs ).toAscii();
}

void createTestFile( const char *pFileName, const char *line,
                     unsigned long ulLinesAmount )
{
    QFile file( pFileName );
    if( file.open( QIODevice::WriteOnly ) )
    {
        QTextStream txtStream( &file );
        for( unsigned long i = 0; i < ulLinesAmount; ++i )
        {
            txtStream << line << i+1 << CURRENT_LINES_DELEMITER;
        }
        file.close();
        cout  << endl << "The " << pFileName << " contains " << ulLinesAmount
                << " lines \""<< line << "\"" << endl;
    }
}

void test( const char* pFile, const char *pLine, unsigned long ulLinesCount, int iTests )
{
    string strFileName( pFile );
    strFileName.append( ".txt" );

    const char *pFileName = strFileName.c_str();
    createTestFile( pFileName, pLine, ulLinesCount );
    pointer2function ptr2Func = NULL;

    for( int i = 0; i < iTests; ++i )
    {
        ptr2Func = &::nixMan;
        cout << callTestFunction( ptr2Func, pFileName ) << " by nixMan" << endl;

        ptr2Func = &::garryHotDog;
        cout << callTestFunction( ptr2Func, pFileName ) << " by harryHotDog" << endl;

        ptr2Func = &::sendevent;
        cout << callTestFunction( ptr2Func, pFileName ) << " by sendevent" << endl;

        ptr2Func = &::kambala;
        cout << callTestFunction( ptr2Func, pFileName ) << " by kambala" << endl;

        ptr2Func = &::konstantin;
        cout << callTestFunction( ptr2Func, pFileName ) << " by konstantin" << endl;
    }
}

int main(int /*argc*/, const char** /*argv*/)
{
    unsigned long ulShortTest = 1024;
    unsigned long ulLongTest = ulShortTest*ulShortTest;

    test( "testShortWithoutSpaces", "line_line", ulShortTest, 1 );
    test( "testShortWithSpaces", "line line",  ulShortTest, 1 );
    test( "testLongtWithoutSpaces", "line_line", ulLongTest, 1 );
    test( "testLongtWithSpaces", "line line", ulLongTest, 1 );
   
    return 0;
}

вкратце:
Цитата: gcc version 4.4.1 /gcc-4_4-branch revision 150839/ (SUSE Linux)
The testShortWithoutSpaces.txt contains 1024 lines "line_line"
1024 lines were found at 1 ms by nixMan
1024 lines were found at 7 ms by harryHotDog
1024 lines were found at 0 ms by sendevent
1025 lines were found at 1 ms by kambala
1024 lines were found at 0 ms by konstantin

The testShortWithSpaces.txt contains 1024 lines "line line"
2048 lines were found at 0 ms by nixMan
1024 lines were found at 1 ms by harryHotDog
1024 lines were found at 0 ms by sendevent
1025 lines were found at 1 ms by kambala
1024 lines were found at 0 ms by konstantin

The testLongtWithoutSpaces.txt contains 1048576 lines "line_line"
1048576 lines were found at 349 ms by nixMan
1048576 lines were found at 777 ms by harryHotDog
1048576 lines were found at 90 ms by sendevent
1048577 lines were found at 884 ms by kambala
1048576 lines were found at 69 ms by konstantin

The testLongtWithSpaces.txt contains 1048576 lines "line line"
2097152 lines were found at 635 ms by nixMan
1048576 lines were found at 776 ms by harryHotDog
1048576 lines were found at 85 ms by sendevent
1048577 lines were found at 864 ms by kambala
1048576 lines were found at 69 ms by konstantin
qt-based варианты (сплит и построчное чтение QTextStream'ом) - самые прожорливые, QString::count( const QString & - не регвыр!) - довольно шустр, но, как и предыдущие, не учитывает размер файла (обходится, но... оно того не стоит, читаем дальше). стл-вариант в текущем виде не канает для студии и в качестве разделетиля всасывает и пробелы (если верить гуглу - лечится, но я не стал заморачиваться).
итог: самый задро почетный нерд этой ночи с пт на сб - Константин!

ps: пока писал тест - обратил внимание: нихто не закрывает файлы. это обусловлено
а) забыл;
б) это пример кода - тут не важно;
в) QFile при уничтожении сам все закроет?
если в) - както я это упустил (а  лезть в ассист - уже лень).


Название: Re: Количество строк в текстовом файле
Отправлено: Igors от Май 15, 2010, 04:48
в) QFile при уничтожении сам все закроет?
если в) - както я это упустил (а  лезть в ассист - уже лень).
Да. закроет. И еще одна мелочь: в студии может быть очень большая разница между STL скомпиленным в "debug" и "release". Для чистоты эксперимента (и чтобы избежать возможных обвинений в необъективности) нужно использовать "release". А вообще спасибо за проделанную работу - приятно видеть реальные факты и цифры. Конструктивно, по делу.


Название: Re: Количество строк в текстовом файле
Отправлено: ритт от Май 15, 2010, 05:15
и использованием QTestLib результат был бы точнее, а код проще.
и почему это я - задро^W нерд? лишь из-за того, что мой код оказался много шустрее других? (


Название: Re: Количество строк в текстовом файле
Отправлено: sendevent от Май 16, 2010, 01:02
Цитата: Igors
<...>в студии может быть очень большая разница<...>
я ж грю - STL-вариант в приведенном виде студией (2008) не собирается. решение с переопределением
Код:
istream operator>>(istream& is, MyCustomStringImp& s)
(чтоб оно целиком строки читало) добавило компиллябильности, но с STL я встречаюсь довольно редко и "на Вы" - умудрился накосячить, не заработало :-[ потому проверял тока с gcc.

Цитата: Константин
и использованием QTestLib результат был бы точнее, а код проще.
стыдно признаться, КуТест никада не трогал... обещаю исправится, в аттаче - первый опыт.
Цитата: Константин
и почему это я - задро^W нерд? лишь из-за того, что мой код оказался много шустрее других? (
ну... мы же брутальные программисты, да еще и в рунете - если скажу "чувак, малаццом!" - может быть воспринято как "плюс адин", потому и приходится доносить мысли через дебри ироний, сарказмов, самоироний-самосарказмов и ваще поддерживать вид программиста с нЕрдически-стойким характером.
(как бы, задрот тут - я, ибо заморочился на такую, казалось бы, мелочь, как сабж, на таком уровне; да и еще, оказывается, обожаю, блин, запятые).

и так, перевод на КуТест, поточнее и пооопешнее, "первая кровь".
приведенные примеры кода постарался прооптимизировать - выкинул ненужные закрытия файлов, вместо break'ов - return'ы, поправил написание ника nixMan vs niXman, но это шутка. результат, вроде, не особо отличается, и теперь он примерно такой:

Цитата: programm uotput
********* Start testing of LinesCounterTest *********
Config: Using QTest library 4.6.3, Qt 4.6.3
PASS   : LinesCounterTest::initTestCase()
<тут должно быть самое интересное, но получается большая простыня текста, поэтому выкинул. кому интересно - сами могут запустить тест>
PASS   : LinesCounterTest::cleanupTestCase()
Totals: 6 passed, 2 failed, 0 skipped
********* Finished testing of LinesCounterTest *********

или так:
Цитировать
author shortNS/shortWS longNS/longWS
niXman 0.4/-- 430/--
garryHotDog 1.4/1.3 1,397/1,305
sendevent 0.16/0.15 270/246
kambala 0.84/0.75 1,315/1,319
konstantin 0.11/0.10 115/113
здесь: short=1024, long=short*short, NS=NoSpaces, WS=WithSpaces, точка - дробь, запятая - тысячи.

при этом всплыла "неочевидная" особенность - в зависимости от исходного файла и отношения к пустым строкам в счестчике - сфейлить могут все приведенные варианты. (N строк в файле - необязательно N "переводов строк", и не всегда надо игнориовать пустую... комуто может показаться банальным, но я сразу об этом не подумал).
для теста используются файлы "кадждая строка с endl", чтобы работать с "последняя строка - без endl'а" - каждый вариант можно лехко допилить.
ну и, как можно было догадаться, опять не рассматривается вариант "на платформе X файл с endl'ами с платформы Y" - тот, у кого стоит такая задача, должен быть в состоянии самостоятельно воспользоваться ранее приведенным примером. (цель была не "протестить все на всем", а так, в общих чертах).


Название: Re: Количество строк в текстовом файле
Отправлено: spectre71 от Май 16, 2010, 13:19
1) Не правильно создаятся тестовые файлы!
Они открываются в текстовом режиме, соответственно под windows:
#define CURRENT_LINES_DELEMITER "\r\n" в конце строки образует 0D0D0A :)
2) Общее кол-во строк всегда считается с учетом пустых строк. И здесь без вариантов.
Не надо путать с задачей подсчета кол-ва непустых строк.
Так что не один из методов не дает правильный результат.


Название: Re: Количество строк в текстовом файле
Отправлено: spectre71 от Май 16, 2010, 14:36
Код
C++ (Qt)
qint64 lineCount(const char* FileName) {
 char fsm [256][8];
 int fh = open(FileName, O_RDONLY|O_BINARY);
 
 if(fh < 0) {
   return -1;
 } else {
   char fsm0 [8] = {6,0,0,0,0,0,6,0};
   char fsm1 [8] = {3,1,5,1,5,1,3,1};
   char fsm2 [8] = {4,2,2,2,2,2,4,2};
 
   for(int i=0; i<256; i++) {memcpy(&(fsm[i][0]), &(fsm0[0]), sizeof(fsm0));}
   memcpy(&(fsm[(unsigned char)'\n'][0]), &(fsm1[0]), sizeof(fsm1));
   memcpy(&(fsm[(unsigned char)'\r'][0]), &(fsm2[0]), sizeof(fsm2));
 }
 
 unsigned char  buff[1024*256];
 int  state = 7;
 qint64 lcount = 0;
 unsigned int len;
 unsigned char* str;
 unsigned char* strE;
 
 for(;;) {
   len = read(fh, buff, sizeof(buff));
   if(!len) {break;}
   if(len < 0) {
     close(fh);
     return -1;
   }
   str   = buff;
   strE  = str+len;
   for(; str<strE; ++str) {
     switch((state = fsm[*str][state])) {
       case 0: case 1: case 2: lcount++;
     }
   }
 }  
 if(lcount) {
   switch(state) {
     case 1: case 2: case 3: case 4: case 5: lcount++;
   }
 }
 
 close(fh);
 return lcount;
}  
 

Самый быстрый способ подсчета строк. Хорошо видно на больших файлах (100 MB; 1,2,10 GB, ...)
Понимает любые перносы строк, в том числе и комбинированные, а также испорченные файлы редактировавшиеся на разных плаформах (преносы типа "0D0D0A0D" итп)

Замена способа чтения буфера:
- "read" на "fread" - увеличит время ~ на 15%
- "read" на "QFile::read" - увеличит время ~ на 70%

Для подсчета строк кол-во состояний можно и уменьшить, поскольку часть из них нужна для определения начал и концов строк.


Название: Re: Количество строк в текстовом файле
Отправлено: Igors от Май 17, 2010, 00:10
Ну если уж такое дело - вот мой вариант приаттачен. Интересно сравнить по скорости с предыдущими. Мне кажется разумный баланс это:

- большие файлы обрабатывать надо, не стоит надеяться что все влезет в память
- концы строк "чужой платформы" обрабатывать надо, эта ситуация встречается часто 
- смешанные (битые) концы строк - мне кажется это уже перебор, здесь можно и соврать  :)

И еще немаловажно: ф-ция должна быть достаточно простой и понятной. Spectre, я верю что Ваш вариант самый быстрый, но разобраться в нем ... Что делать если где-то заклинит? Ломать голову с теорией автоматов?  :) Пусть лучше медленнее - зато намного проще


Название: Re: Количество строк в текстовом файле
Отправлено: spectre71 от Май 17, 2010, 12:09
Два варианта
=================

Мой:
Код
C++ (Qt)
qint64 lineCount1(const char* FileName) {
 char fsm0 [8] = {6,0,0,0,0,0,6,0};
 char fsm1 [8] = {3,1,5,1,5,1,3,1};
 char fsm2 [8] = {4,2,2,2,2,2,4,2};
 char fsm [256][8];
 
 for(int i=0; i<256; i++) {memcpy(&(fsm[i][0]), &(fsm0[0]), sizeof(fsm0));}
 memcpy(&(fsm[(unsigned char)'\n'][0]), &(fsm1[0]), sizeof(fsm1));
 memcpy(&(fsm[(unsigned char)'\r'][0]), &(fsm2[0]), sizeof(fsm2));
 
 QFile File(FileName);
 if (!File.open(QFile::ReadOnly)) {return -1;}
 
 char   buff[1024*128];
 qint64 lcount = 0;
 int    len;
 
 int   state = 7;
 char* str;
 char* strE;
 for(;;) {
   len = File.read(buff, sizeof(buff));
   if (File.error()) return -1;
   if(!len) {break;}
 
   str   = buff;
   strE  = str+len;
   for(; str<strE; ++str) {
     switch((state = fsm[(unsigned char)*str][state])) {
       case 0: case 1: case 2: lcount++;
     }
   }
 }  
 if(lcount) {
   switch(state) {
     case 1: case 2: case 3: case 4: case 5: lcount++;
   }
 }
 return lcount;
}  
 

Немного переделаный вариант Igors:
Код
C++ (Qt)
qint64 lineCount2(const char* FileName) {
 QFile File(FileName);
 if (!File.open(QFile::ReadOnly)) return -1;
 
 char   buff[1024*128];
 qint64 lcount = 0;
 int    len;
 
 char prev = 0;
 char cur  = 0;
 for(;;) {
   len = File.read(buff, sizeof(buff));
   if (File.error()) return -1;
   if(!len) {break;}
 
   for (int i=0; i<len; ++i) {
     cur = buff[i];
     if      (cur  == 10) {++lcount;}
     else if (prev == 13) {++lcount;}
     prev = cur;
   }
 }
 if (cur == 13) {++lcount;}
 return lcount + 1;
}
 

В аттаче тестовые файлы с разными типами переводов строк


Название: Re: Количество строк в текстовом файле
Отправлено: sendevent от Май 19, 2010, 03:41
раз уж никому, кроме меня, не интересно - "по традиции", циферь:
тестировалось на
Цитата: sendevent@notebook
qt 4.6.3, gcc 4.4.1, oSuSE 11.2, x86_64 (KDE 4.3.5 r0, если че)
тестовые файлы - чуть выше в треде: info.txt/lines-bad.txt/lines-good-lin.txt/lines-good-win.txt.
исходные файлы не изменялись, один прогон (файлы - 488/127/116/154 b соответственно):
Цитата: std::out, ms
spectre:
0.017/0.015/0.015/0.015
igors:
0.014/0.014/0.017/0.042
исходные данные увеличены таким образом (больше - у меня не помещается в ~):
Код:
void createLongFile( const QString& strFileName )
{
    QFile srcFile( strFileName );
    if( srcFile.open( QIODevice::ReadWrite ) )
    {
        QByteArray baContent = srcFile.readAll();
        for( long i = 65536*64; i >= 0; --i )
        {
            srcFile.write( baContent );
        }
    }
}
исходные данные стали 1,900/508/464/616 Mb соответственно; два прогона:
Цитата: std::out, ms
spectre:
1st: 109,592/18,213/16,003/22,033 (*)
2nd: 87,450/18,911/17,738/20,919
igors:
1st: 68,267/17,894/16,370/22,062
2nd: 65,527/18,603/15,370/21,145
(*) -- разница между прогонами (spectre's 109 vs 87 on info.txt)- хз почему: оба раза - молча курил в сторонке, машинку дополнительно ничем не загружал (в кроне нифига нету, апдейты - вручную, активен тока криейтор и дельфин), но, похоже,  либо я чегото накосячил (непойму хде), либо кьют чегото скешировала.


Название: Re: Количество строк в текстовом файле
Отправлено: spectre71 от Май 19, 2010, 10:01
(*) -- разница между прогонами (spectre's 109 vs 87 on info.txt)- хз почему: оба раза - молча курил в сторонке, машинку дополнительно ничем не загружал (в кроне нифига нету, апдейты - вручную, активен тока криейтор и дельфин), но, похоже,  либо я чегото накосячил (непойму хде), либо кьют чегото скешировала.

Естественно что система кеширует файлы. Повторный запуск подряд на том же файле размером в 1GB может дать разницу в порядок и больше! Что и было в моих тестах.
Время чтения из файла(которое может сильно варьировать) почти не имеет отношения к проверке скорости работы алгоритма и это необходимо учитывать.