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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бенчмарким здесь 
:(
    Опции темы
Mayk
  Дата 25.10.2005, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

Репутация: 45
Всего: 134



Ну что. Раз тему закрыли, пора открывать новые.

Я давно хотел побенчмаркить IO и вот что вышло.
(тест состоит из 99 итераций, в каждой из которой
из /dev/zero считывается n байт и записываются в /dev/null
в каждой итерации n пробегает следующий ряд чисел:
1 байт, 100 байт, 1 кб, 10 кб,
~1 мб, ~2 мб, ~3 мб, ~4 мб, ~6 мб, ~7 мб, ~4 мб, 1 байт, ~10 мб)

bm.c:
Код

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main()
{
        //ammount of bytes to read each
        int read[]={1,100,1024,10240,
                    1024000, 1024000*2,
                    1024000*3, 1024000*4,
                    1024000*6, 1024000*7,
                    1024000*4, 1,
                    1024000*10
        };
        int iterations=99;

        //elements in read[] array
        int arrs = sizeof(read)/sizeof(read[0]);

        //buffer
        char* a = malloc(1024000*10);

        //start time
        clock_t start = clock();

        FILE* f = fopen("/dev/zero","rb");
        FILE* f1 = fopen("/dev/null","wb");
        int i;
        while(iterations--){
                for(i = 0; i != arrs; ++i){
                        fread(a, read[i], 1, f);
                        fwrite(a, read[i], 1, f1);
                }

        }
        fclose(f);
        fclose(f1);
        free(a);
        printf("C: %f seconds\n",((double)clock()-start)/CLOCKS_PER_SEC);
}


bm.cpp:
Код

#include <time.h>
#include <fstream>
using namespace std;

int main()
{
        //ammount of bytes to read each
        int read[]={1,100,1024,10240,
                    1024000, 1024000*2,
                    1024000*3, 1024000*4,
                    1024000*6, 1024000*7,
                    1024000*4, 1,
                    1024000*10
        };
        int iterations=99;

        //elements in read[] array
        int arrs = sizeof(read)/sizeof(read[0]);

        //buffer
        char* a = new char[1024000*10];

        //start time
        clock_t start = clock();

        ifstream f("/dev/zero");
        ofstream f1("/dev/null");
        int i;
        while(iterations--){
                for(i = 0; i != arrs; ++i){
                        f.read(a, read[i]);
                        f1.write(a, read[i]); 
                }
        }
        f.close();
        f1.close();
        delete a;
        printf("C++: %f seconds\n",((double)clock()-start)/CLOCKS_PER_SEC);
}


Результат:
C:
Цитата

C: 0.110000 seconds
C: 0.110000 seconds
C: 0.110000 seconds
C: 0.100000 seconds
C: 0.110000 seconds
C: 0.100000 seconds
C: 0.110000 seconds
C: 0.110000 seconds
C: 0.100000 seconds
C: 0.110000 seconds

в среднем ~0.1 секунда

C++:
Цитата

C++: 13.330000 seconds
C++: 13.430000 seconds
C++: 13.450000 seconds
C++: 13.470000 seconds
C++: 13.450000 seconds
C++: 13.400000 seconds
C++: 13.620000 seconds
C++: 13.400000 seconds
C++: 13.430000 seconds
C++: 13.410000 seconds

в среднем ~13 секунд...

Эээ.... Какие будут комментарии?

зы. в яве не делал, не могу отойти от шока %)
Добавлено @ 18:55
(тестовая конфигурация: cel 1700, 384 mb, linux, gcc3.3.5)

(UPDATED: блин, только заметил что читаются не мегабайты, а 1000 килобайт. перезапускать тест не стал).

Это сообщение отредактировал(а) Mayk - 25.10.2005, 19:24


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
nikitao
Дата 25.10.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

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



Гхе...С++ конечно тормознутее по уважительным причинам,но чтоб настолько...Гхх В 13 раз.Жуть.А на яве итого больше будет все 20(хотя черт знает).
Ща у себя тесты проведу...


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Mayk
Дата 25.10.2005, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

Репутация: 45
Всего: 134



Да. Вот еще что.
Тесты собирал так.
Код

all: bm_io_c bm_io_cpp

bm_io_c: bm.c
        gcc -O6 bm.c -o bm_io_c

bm_io_cpp: bm.cpp
        g++ -O6 bm.cpp -o bm_io_cpp




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Mayk
Дата 25.10.2005, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

Репутация: 45
Всего: 134



(расчет времени честно взят ]отсюда)
Код

import java.io.*;
public class bm_io_java
{
        static int[] read={1,100,1024,10240,
                    1024000, 1024000*2,
                    1024000*3, 1024000*4,
                    1024000*6, 1024000*7,
                    1024000*4, 1,
                    1024000*10
        };

        static public void main(String[] s) throws Exception{
                long t1 = System.currentTimeMillis();
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream("/dev/zero"));
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("/dev/null"));
                byte[] a = new byte[10240000];
                int iterations=99;
                int i;
                int arrs=read.length;
                while(iterations-- > 0){
                        for(i=0;i!=arrs;++i){
                                bis.read(a,0,read[i]);
                                bos.write(a,0,read[i]);
                        }
                }                
                System.out.println("\n Program execution time is " + ((double)(System.currentTimeMillis() - t1))/1000.0 + "   seconds");
        }
};

Program execution time is 5.887 seconds
Program execution time is 5.847 seconds
Program execution time is 5.881 seconds
Program execution time is 5.86 seconds
Program execution time is 5.888 seconds
Program execution time is 5.922 seconds
Program execution time is 5.906 seconds
Program execution time is 5.851 seconds
Program execution time is 5.894 seconds
Program execution time is 5.858 seconds



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
S.A.P.
Дата 25.10.2005, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 9
Всего: 71



Нет уж, давайте без ГЭ ЦЭ ЦЭ!!! smile Перенесите всю на винду, там и побенчмарким.

А то я в эти dev/null, dev/zero не вьезжаю smile .
PM MAIL   Вверх
nikitao
Дата 25.10.2005, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

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



Цитата
Нет уж, давайте без ГЭ ЦЭ ЦЭ!!!  Перенесите всю на винду, там и побенчмарким.

А то я в эти dev/null, dev/zero не вьезжаю

Я вот тоже.Сказал,что буду тестить ,а код не смотрел=>ерунда вышла.Получилось что C++ быстрее С.Как-нибудь под обычную Windy smile


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
yaja
Дата 25.10.2005, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(nikitao @ 25.10.2005, 19:14)
В 13 раз

в 130 раз помоему smile
Я когда то ради развлекухи читал файл в 1 метр по одному байту путем fread и ifstream. В первом случае дождался, а во втором после одного часа вырубил нафиг.... smile
PM MAIL   Вверх
bel_nikita
Дата 25.10.2005, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



не люблю я эти stream'ы. без них обхожусь.
А переключение тредов не учитывали?



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Mayk
Дата 26.10.2005, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

Репутация: 45
Всего: 134



Цитата(bel_nikita @ 26.10.2005, 03:31)
А переключение тредов не учитывали?

Единственное что учитывалось - это общее время smile

Цитата(nikitao @ 26.10.2005, 01:45)
Цитата
Нет уж, давайте без ГЭ ЦЭ ЦЭ!!!  Перенесите всю на винду, там и побенчмарким.
А то я в эти dev/null, dev/zero не вьезжаю
Я вот тоже.Сказал,что буду тестить ,а код не смотрел=>ерунда вышла.Получилось что C++ быстрее С.Как-нибудь под обычную Windy


Млин. Фантазии у вас совсем что-ли нет? /dev/zero замените на любой файл большого размера(метров 60 за глаза хватит, так как 1+2+3+...+10 мб=55), желательно чтоб был на RAMDISKе, /dev/null замените на NUL. А то если из файла в файл копировать, то больше винты на фрагментацию тестить можно, а не языки smile

Это сообщение отредактировал(а) Mayk - 26.10.2005, 08:30


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
S.A.P.
Дата 26.10.2005, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 9
Всего: 71



Цитата(Mayk @ 26.10.2005, 08:29)
Млин. Фантазии у вас совсем что-ли нет? /dev/zero замените на любой файл большого размера(метров 60 за глаза хватит, так как 1+2+3+...+10 мб=55), желательно чтоб был на RAMDISKе, /dev/null замените на NUL.
заменил . Входной файл - реальный.

Мои результаты:

MinGW
C: 26.843000 seconds
C++: 16.109000 seconds

VC
C: 23.828000 seconds
C++: 16.141000 seconds

ЫЫЫЫЫ? smile

Добавлено @ 16:06
Ramdrive не использовал, че я вам, в досе тестит буду? smile .
PM MAIL   Вверх
bel_nikita
Дата 26.10.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



еще бы не плохо на исходники сгенерированых asm файлов глянуть
Добавлено @ 17:14
и еще поставить максимальный приоритет треду
Добавлено @ 17:19
Под Window'озом можно использовать замер времени через класс:
Код

  class cCounterTimer
  {
  public:
    cCounterTimer()         {QueryPerformanceFrequency(&counterFreq);QueryPerformanceCounter(&counterStart);}
    ~cCounterTimer()        {}
    __int64 GetFrequency()  {return counterFreq.QuadPart;}
    void    Start()         {QueryPerformanceCounter(&counterStart);}
    __int64 TimeElapseds()  {QueryPerformanceCounter(&counterStop);return (counterStop.QuadPart - counterStart.QuadPart)/counterFreq.QuadPart;}
    __int64 TimeElapsedms() {QueryPerformanceCounter(&counterStop);return (counterStop.QuadPart - counterStart.QuadPart)*1000/counterFreq.QuadPart;}
    __int64 TimeElapsedmcs(){QueryPerformanceCounter(&counterStop);return (counterStop.QuadPart - counterStart.QuadPart)*100000/counterFreq.QuadPart;}
    //////////////////////////////////////////////////////////////////////////
    void    Stop()          {QueryPerformanceCounter(&counterStop);}
    __int64 Get_s()         {return (counterStop.QuadPart - counterStart.QuadPart)/counterFreq.QuadPart;}
    __int64 Get_ms()        {return (counterStop.QuadPart - counterStart.QuadPart)*1000/counterFreq.QuadPart;}
    __int64 Get_mcs()       {return (counterStop.QuadPart - counterStart.QuadPart)*1000000/counterFreq.QuadPart;}
    void    Wait_mcs(const __int64& Time)
    {
      LARGE_INTEGER Start,Stop;
      QueryPerformanceCounter(&Start);
      while (true) {
        QueryPerformanceCounter(&Stop);
        if ( Time>=(Stop.QuadPart-Start.QuadPart)*1000000/GetFrequency() ) break;
      }

    }
  private:
    LARGE_INTEGER counterFreq;
    LARGE_INTEGER counterStart;
    LARGE_INTEGER counterStop;
  };



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0798 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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