Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прочитать весь файл 
V
    Опции темы
Daevaorn
Дата 26.4.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(dizzy1984 @  26.4.2007,  16:24 Найти цитируемый пост)
 ifstream in("C:\\mp3\\Apocaliptica\\01 - Prologue (Apperhension).mp3");    FILE * in2 = fopen("C:\\mp3\\Apocaliptica\\01 - Prologue (Apperhension).mp3","rb");

мне кажется или участники не в равных условиях?
PM MAIL WWW   Вверх
JackYF
Дата 26.4.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(dizzy1984 @  26.4.2007,  15:24 Найти цитируемый пост)
str1=RDTSC();
        in.read(buf,SIZE);
        str2=RDTSC();
        totalstr += str2-str1;
        in.seekg(0, ios::beg);
        fr1=RDTSC();
        fread(buf,1,SIZE,in2);
        fr2=RDTSC();
        totalfr += fr2-fr1;
        rewind(in2);


Э, не понял... За каким гуком здесь стоят seekg и rewind? Постоянно считывать одни и те же 64К?
Дак их система закэширует по ей одной понятному принципу... Данный код ничего реального не отображает.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
JackYF
Дата 26.4.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Ну вот я сделал и свои замеры. Код следующий был у меня (MinGW)

Код

#include <iostream>
#include <fstream>
#include <cstdio>

#include <yf/yfTime/time.hpp>

#define SIZE 64000
int main()
{
   char filename[] = "d:\\TempInstall\\Downloads\\qt-win-opensource-src-4.2.3.zip";

   std::ifstream in(filename, std::ios::binary);


   char buf[SIZE];
   yf::micro_time_t time1, time2, time3;

   time1 = yf::micro_time();
   ulong count = 100;
   for (int i=0;i<count;i++)
   {
      in.read(buf,SIZE);
      std::cout << buf[77];
   }
   in.close();
   time2 = yf::micro_time();
   std::FILE * in2 = fopen(filename,"rb");
   for (int i=0;i<count;i++)
   {
      std::fread(buf,1,SIZE,in2);
      std::cout << buf[77];
   }
    time3 = yf::micro_time();
    fclose(in2);

    std::cout << "\nIostreams time: ";
    yf::write_micro_time( time1, time2 );
    std::cout << "C-files time: ";
    yf::write_micro_time( time2, time3 );
}


Файл 42-метровый, если что.
"std::cout << buf[77]" для облома компилятору оптимизировать вызов функции, так как без этого он явно пытается это делать.
Собрано в release.

Итак, результаты:
Код

Iostreams time: 0.016732 sec
C-files time: 0.015679 sec


Разницу в 5 раз во времени не вижу.

Реализация замера времени в данном случае - QueryPerformanceFrequency/QueryPerformanceCounter.

Добавлено через 7 минут и 27 секунд
Цитата(Daevaorn @  26.4.2007,  15:36 Найти цитируемый пост)
мне кажется или участники не в равных условиях? 

Что ты здесь имел в виду? Отсутствие ios::binary? Или что-то другое?


Это сообщение отредактировал(а) JackYF - 26.4.2007, 17:01


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
dizzy1984
Дата 26.4.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Цитата(JackYF @  26.4.2007,  16:29 Найти цитируемый пост)
Э, не понял... За каким гуком

Чтобы не прочитать за конец файла

Цитата(JackYF @  26.4.2007,  16:29 Найти цитируемый пост)
Дак их система закэширует по ей одной понятному принципу

Через чур интеллектуально для системы


Цитата(JackYF @  26.4.2007,  16:29 Найти цитируемый пост)
Данный код ничего реального не отображает.

Принимается. Изменил на другой

Код

volatile unsigned __int64 RDTSC()

{              __asm __emit 0fh __asm __emit 0a2h 

                __asm __emit 0fh __asm __emit 031h 
}

#define SIZE 64000
void CVg1Dlg::OnOK() 
{
    ifstream in("C:\\Documents and Settings\\Administrator\\My Documents\\Books\\Библиотека Мошкова\\Moshkov_books(RUS)_lib.ru.part1.rar");     //720метров
    char buf[SIZE];

    unsigned __int64 totalstr=0, totalfr=0, str1, str2, fr1, fr2 ;
    for (int i=0;i<10000;i++)
    {
        str1=RDTSC();
        in.read(buf,SIZE);
        str2=RDTSC();
        totalstr += str2-str1;
    };
    in.close();

    FILE * in2 = fopen("C:\\Documents and Settings\\Administrator\\My Documents\\Books\\Библиотека мошкова\\Moshkov_books(RUS)_lib.ru.part1.rar","rb");     //720метров
    for (i=0;i<10000;i++)
    {
        fr1=RDTSC();        
        fread(buf,1,SIZE,in2);        
        fr2=RDTSC();
        totalfr += fr2-fr1;
    }
    fclose(in2);
 }


Режим Release.
Первый цикл пробегает за какую-то долю секунды.
За время второго я успеваю сосчитать до 25-ти

Цитата(JackYF @  26.4.2007,  16:59 Найти цитируемый пост)
 ulong count = 100;

Чего мелочиться? давай уж хотя бы 10^4

Вобщем я бы мог поспорить на счет правильности вывода и точности счетчиков, но дело-то в том что у меня разница заметна "на глаз". 
Я пробую на vs6.0, но и на 8-ке у меня все летало. Хорошо помню как считал построчно и обработал каждую строку в файле 80-метров за 3 секунды. 
Может дело в различной реализации?

И вот еще что... вертелось в голове не мог сформулировать. Возможно фишка проявляется на вызове повторяющихся операций, а не на одиночных. 
Тогда твои результаты можно объяснить небольшим количеством итераций. (у меня их в 100 раз больше)

Это сообщение отредактировал(а) dizzy1984 - 26.4.2007, 20:53
PM MAIL   Вверх
JackYF
Дата 27.4.2007, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(dizzy1984 @  26.4.2007,  20:41 Найти цитируемый пост)
Первый цикл пробегает за какую-то долю секунды.


Забавно. Давай подсчитаем количество считанных тобой байт. За одно считывание у нас читается приблизительно 64К.
Считываний у тебя 10000. Итого мы считываем 10000*64К = 10*64М = 640 Мб.
Ты говоришь, что это происходит за долю секунды?

По имеющимся у меня сведениям, скорость 640 Мб/с не имеет ни один жесткий диск.

В данном случае я считаю, что компилятор твой оптимизирует вызов в первом случае, и ничего реально из файла не читает. Добавь вывод нулевого символа буфера на экран либо в другой файл в каждой итерации, приблизительно, как у меня. И скажи, что из этого получится.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
ZC1989
Дата 27.4.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



ребят, вас чё понесло-то?? smile 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
JackYF
Дата 27.4.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(ZC1989 @  27.4.2007,  10:14 Найти цитируемый пост)
ребят, вас чё понесло-то??


Лично я увидел фразу

Цитата(dizzy1984 @  24.4.2007,  13:33 Найти цитируемый пост)
Не проверял, но думаю что если этот код _stranger_ переписать с использованием ifstream, то будет выигрыш в скорости чтения 


И я с этим не согласен. Отсюда все мои посты. Обертка в С-файлов в удобные классы для работы, которые написаны по ООП и в рамках STL - очень хорошая вещь. Во многих случаях облегчает жизнь, особенно сначала. Но от того, что мы обернем что-нибудь в красивую оболочку, скорость не увеличится.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
ZC1989
Дата 27.4.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



JackYF, вы тут делагогию развели по пустому! я сделал что хотел... за эт пасибо... я не просил самый быстрый способ... smile 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
JackYF
Дата 27.4.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(ZC1989 @  27.4.2007,  14:31 Найти цитируемый пост)
по пустому!

Нет, не по пустому... Это довольно-таки принципиальный вопрос - вопрос скорости работы С-файлов и С++-потоков.

В данном случае скорость не роляет, это да.

Если оффтопик, то можно выделить в отдельную тему...



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
dizzy1984
Дата 27.4.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Высокая скорость работы первого цикла объяснялась отсутствием процесса чтения. Метод read читал первые 4-ре байта и встречал символ ctrl+z, а посколько файл был открыт как текстовый ( smile ) воспринимал это как конец файла и ставил статус "все плохо". все последующие 10000-1 итерации работа метода обрывалась где-то в самом начале на проверке статуса.
Я добавил std::ios::binary в конструктор потока. Время срабатывания метода ofstream::read стало больше, чем fread от 1.5ра до где-то 10-ти раз.
Я зря спорил с тобой, ты был прав с самого начала.
Извини.


P.S Мне было интересно и я попробовал также CStdioFile::Read. В большинстве случаев он шел очень близко к fread.
PM MAIL   Вверх
Daevaorn
Дата 27.4.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(dizzy1984 @  27.4.2007,  17:56 Найти цитируемый пост)
Метод read читал первые 4-ре байта и встречал символ ctrl+z, а посколько файл был открыт как текстовый (  ) воспринимал это как конец файла и ставил статус "все плохо". все последующие 10000-1 итерации работа метода обрывалась где-то в самом начале на проверке статуса.Я добавил std::ios::binary в конструктор потока. 

вот-вот. я про это и говорил.
PM MAIL WWW   Вверх
JackYF
Дата 27.4.2007, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Daevaorn @  27.4.2007,  17:17 Найти цитируемый пост)
вот-вот. я про это и говорил. 

Ага, понятно. Я тогда заметил отсутствие ios::binary, но забыл про такую фишку чтения текстовых файлов...
Тогда многое становится ясным.


Цитата(dizzy1984 @  27.4.2007,  16:56 Найти цитируемый пост)
Я зря спорил с тобой, ты был прав с самого начала.
Извини.

Не надо извиняться, главное, что все стало на свои места. Мы провели ряд экспериментов, и теперь не будем голословными в этом вопросе.
В споре рождается истина, как бы банально это не звучало.

Вот теперь тему можно точно закрывать.




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.