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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какой компилятор быстрее выполняет код? 
:(
    Опции темы
Lacoste1024
Дата 23.3.2011, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте! Я делаю исследовательскую работу по шифрованию. Сейчас я на этапе шифрования методом с ключом. 
Код шифратора:
Код
#include <stdio.h>
#include <string.h>

main()
{
   char key[255], ch;
   int i = 0, LenKey, c;
   FILE *fin, *fout, *fkey;
   
   fkey = fopen("key.txt", "r");
   fgets( key, 255, fkey );
   LenKey = strlen(key);
   fclose( fkey );
   
   fin = fopen("input.txt", "r");
   fout = fopen("encoded.txt", "w");
   
   while (( ch=fgetc(fin) ) != EOF ) {
      c = ch + key[i];
      ch = c;
      fputc(ch, fout);
      i++;
      i = i % LenKey; 
   }
   fclose(fin);
   fclose(fout);
}

1. Можно ли как-нибудь оптимизировать код, чтобы программа работала быстрее?
2. В каком компиляторе (Borland C++, Visual C++, Dev-C++) этот код будет выполняться быстрее? 
3. И ещё, если я несколько раз буду запускать программу, то с каждым последующим запуском время её работы сокращается. Объясните почему?
Буду очень благодарен!
PM MAIL   Вверх
bsa
Дата 23.3.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Lacoste1024
1. можно - читай файл полностью в буфер, а затем его обрабатывай, но может не хватить памяти. Как вариант, читай большими порциями в буфер.
2. разницу в скорости ты не заметишь, даже если она и будет. основной затык - множество вызовов функций fgetc/fputc.
3. не с каждым разом. При первом запуске исходный файл загружается ОС в кэш, поэтому при повторном запуске уже не читается с диска.
PM   Вверх
Lacoste1024
Дата 23.3.2011, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



bsa, 
Цитата
1. можно - читай файл полностью в буфер, а затем его обрабатывай, но может не хватить памяти. Как вариант, читай большими порциями в буфер.

Знаний для этого, боюсь, у меня мало. 
А если файл читать построчно, а не посимвольно (код в 1м посте), разница большая будет?

Цитата
2. разницу в скорости ты не заметишь, даже если она и будет.

У меня есть специальная программа, которая измеряет время выполнения EXEшников до миллисекунд
PM MAIL   Вверх
borisbn
Дата 23.3.2011, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Lacoste1024 @  23.3.2011,  11:56 Найти цитируемый пост)
В каком компиляторе (Borland C++, Visual C++, Dev-C++) этот код будет выполняться быстрее? 

про компилятор Dev-C++ никогда не слышал. просветишь ?

Цитата(Lacoste1024 @  23.3.2011,  14:09 Найти цитируемый пост)
У меня есть специальная программа, которая измеряет время выполнения EXEшников до миллисекунд


bsa имел в виду, что если ты будешь читать файл по одному символу, то в одном компиляторе это будет работать, допустим 30 сек, а в другом - 30,000001 сек.

Если же будешь читать/писать весь файл (или достаточно большими блоками) то Visual C++ будет быстрее от 2-х до 10 раз в зависимости от задачи. Есть ещё компилятор от Intel. Раньше он "бил" студийный раза в 1,5...2, а на последней студии я разницы не заметил.

Судя по списку компиляторов - у тебя windows, поэтому gcc советовать не буду


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
baldina
Дата 23.3.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Lacoste1024 @  23.3.2011,  11:56 Найти цитируемый пост)
2. В каком компиляторе (Borland C++, Visual C++, Dev-C++) этот код будет выполняться быстрее? 


Цитата(Lacoste1024 @  23.3.2011,  14:09 Найти цитируемый пост)
У меня есть специальная программа, которая измеряет время выполнения EXEшников до миллисекунд 


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

реальное ускорение процесса можно получить одновременным параллельным шифрованием нескольких участков файла.

Добавлено через 5 минут и 9 секунд
что касается буферизации, имхо удобно и практично использовать отображение файла в память (mmap в POSIX и CreateFileMapping в Windows). пусть ОС занимается буферизацией, это ее задача
PM MAIL   Вверх
Lacoste1024
Дата 23.3.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



borisbn, 
Цитата
про компилятор Dev-C++ никогда не слышал. просветишь ?

http://ru.wikipedia.org/wiki/Dev-C%2B%2 Написан на Delphi, но не пугайтесь. ОН довольно прост и это мне в нём нравится.

А что насчёт строк скажете?
Цитата
А если файл читать построчно, а не посимвольно (код в 1м посте), разница большая будет?

То есть брать строку из файла, перебирать каждый символ и кодировать его.
Для варианта отображения файла в буфер у меня ещё знаний нету)

Кстати я провёл тесты для исследовательской. Текстовый файл размером 89Мб. Кол-во символов - более 900 тысяч. На паскале шифратор полностью шифрует этот текст за 50 секунд. Delphi - 11с. Си - 25с. Дешифратор примерно за такое же время
P.S. Delphi рулит  smile 
P.S.S. На вопрос про строки ответьте пожалста)

Это сообщение отредактировал(а) Lacoste1024 - 23.3.2011, 16:12
PM MAIL   Вверх
borisbn
Дата 23.3.2011, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Lacoste1024 @  23.3.2011,  15:50 Найти цитируемый пост)
http://ru.wikipedia.org/wiki/Dev-C%2B%2 Написан на Delphi, но не пугайтесь. ОН довольно прост и это мне в нём нравится.


1. Я знаю, что такое Dev-C++. Хотел, чтобы ты посмотрел.
первый абзац этой статьи в вики
Цитата

Dev-C++ — свободная интегрированная среда разработки приложений для языков программирования C/C++. В дистрибутив входит компилятор MinGW

2. Ссылка не работает. Не хватает английской буквы B в конце smile


Цитата(Lacoste1024 @  23.3.2011,  15:50 Найти цитируемый пост)
Delphi - 11с. Си - 25с.

Если с дельфи ещё понятно ( хотя тоже - какая версия ? ), то с Си... Какой компилятор ? Приведи свой код на Дельфи, работающий быстрее его аналога на MSVC 2008 (release) и я тебе обещаю плюс 1 в репутацию.

Теперь насчёт строк. Я точно не скажу, но на 99% быстрее не будет, т.к. функция чтения строки работает примерно так:
1. прочитать 1 символ
2. если это не перевод строки goto 1

Быстрее всего будет мапирование файла в память, но если это сложно, то просто чтение не одного символа, а хотя бы 4096.
кури fread

Это сообщение отредактировал(а) borisbn - 23.3.2011, 16:35


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Lacoste1024
Дата 23.3.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



borisbn, 
Delphi - Borland Delphi 7; C++ - C++Builder 6
PM MAIL   Вверх
borisbn
Дата 23.3.2011, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Lacoste1024 @  23.3.2011,  16:54 Найти цитируемый пост)
Delphi - Borland Delphi 7; C++ - C++Builder 6

ессно. Builder - это отрыжка Delphi. К тому же ты наверняка не включал оптимизацию...

ок. лови, допиливай

Код

int main()
{
   char key[255], ch;
   int i = 0, LenKey, c;
   FILE *fin, *fout, *fkey;
   
   fkey = fopen("key.txt", "r");
   if ( fkey == 0 ) // кстати, почему этого не было ?
   {
        return 1;
   }

   fgets( key, 255, fkey );
   LenKey = strlen(key);
   fclose( fkey );
   
   fin = fopen("input.txt", "r");
   fout = fopen("encoded.txt", "w");
   if ( fin == 0 || fout == 0 ) // кстати, почему этого не было ?
   {
        return 2;
   }
   
   int k = 0;
   const int bufSize = 4096;
   while ( ! feof( fin ) )
   {
        char buf[ bufSize ];
        int realyRead = fread( buf, sizeof( char ), bufSize, fin );
        for ( int i = 0; i < realyRead; i++ )
        {
             buf[ i ] = buf[ i ] + key[ k ];
             k = (++k) % LenKey;
        }
        fwrite( buf, sizeof( char ), realyRead, fout );
        if ( realyRead < bufSize )
        {
            break;
        }
   }
   fclose(fin);
   fclose(fout);
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
baldina
Дата 23.3.2011, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(borisbn @  23.3.2011,  17:14 Найти цитируемый пост)
sizeof( char )

улыбнуло
PM MAIL   Вверх
borisbn
Дата 23.3.2011, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ну.... если уж быть точным, то
(из N1905=05-0165)
Цитата

Objects declared as characters (char) shall be large enough to store any member of the implementation’s basic character set.

хотя, согласен, sizeof( *buf ) было бы правильнее. Чтобы можно было безболезненно менять тип этого buf
а вот с заменой на 1 - не согласен.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
baldina
Дата 23.3.2011, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ну если быть точным, то size надо было установить в sizeof buf, а count в 1
или (хуже) size в 1 а count в bufSize 
но я не про это.
а про то, что sizeof(char) == 1 по определению

Добавлено @ 19:16
Цитата(borisbn @  23.3.2011,  18:16 Найти цитируемый пост)
Чтобы можно было безболезненно менять тип этого buf

зачем менять его тип?

Добавлено @ 19:22
Цитата(borisbn @  23.3.2011,  18:16 Найти цитируемый пост)
с заменой на 1 - не согласен

Цитата

5.3.3 Sizeof [expr.sizeof]
...
sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1.
The result of sizeof applied to any other fundamental type (3.9.1) is implementation-defined.


Это сообщение отредактировал(а) baldina - 23.3.2011, 19:22
PM MAIL   Вверх
borisbn
Дата 23.3.2011, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(baldina @  23.3.2011,  19:16 Найти цитируемый пост)
ну если быть точным, то size надо было установить в sizeof buf, а count в 1

в этом случае последний блок не вычитался бы ( при условии что размер файла не кратен 4096, ессно )

Цитата(baldina @  23.3.2011,  19:16 Найти цитируемый пост)
а про то, что sizeof(char) == 1 по определению

я ж дал определение из стандарта. там про размер char'а ничего не говорится. Вернее говорится, что
Цитата(borisbn @  23.3.2011,  18:16 Найти цитируемый пост)
 shall be large enough to store any member of the implementation’s basic character set


А вообще-то правильнее всего делать sizeof( *buf ). В этом случае ты спокойно можешь поменять тип buf в определении например на int
Код

/*char*/int buf[ 4096 ];



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Lacoste1024
Дата 23.3.2011, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



borisbn,
Цитата
Приведи свой код на Дельфи, работающий быстрее его аналога на MSVC 2008 (release) и я тебе обещаю плюс 1 в репутацию

Код

#include <stdio.h>
#include <string.h>

int main()
{
   char key[255], ch;
   int i = 0, LenKey, c;
   FILE *fin, *fout, *fkey;
   
   fkey = fopen("key.txt", "r");
   fgets( key, 255, fkey );
   LenKey = strlen(key);
   fclose( fkey );
   
   fin = fopen("input.txt", "r");
   fout = fopen("encoded.txt", "w");
   
   while (( ch=fgetc(fin) ) != EOF ) {
      c = ch + key[i];
      ch = c;
      fputc(ch, fout);
      i++;
      i = i % LenKey; 
   }
   fclose(fin);
   fclose(fout);
   return 0;
}

Код

program Encoder_;

{$APPTYPE CONSOLE}

uses
   SysUtils;

var
  key : string;
  i, LenKey : integer;
  input, output : text;
  ch: char;

Procedure ReadEncodeKey;
Var KeyFile : Text;
Begin
  Assign(KeyFile,'key.txt');
  Reset(KeyFile);
  Read(KeyFile,key);
  Close(KeyFile);
  LenKey := Length(key);
End;

begin
  i:=1;
  ReadEncodeKey;
  Assign(input,'input.txt'); Reset(input);
  Assign(output,'Encoded.txt'); Rewrite(output);
  While Not EoF(input) Do Begin
    Read(input,ch);
    ch := Chr(Ord(ch) + Ord(key[i]));
    Write(output,ch);
    i:=i+1;
    i:=i mod LenKey + 1;
  End;
  Close(input);
  Close(output);
end.



Как видно коды аналогичны. Delphi кодирует txt файл размером 89Мб за 11с. Программа созданная в MSVC 2010 за 24с
PM MAIL   Вверх
baldina
Дата 24.3.2011, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(borisbn @  23.3.2011,  19:32 Найти цитируемый пост)
я ж дал определение из стандарта. там про размер char'а ничего не говорится. Вернее говорится, что

я ж дал цитату из стандарта, где это явно сказано

Добавлено через 2 минуты и 31 секунду
Цитата(borisbn @  23.3.2011,  19:32 Найти цитируемый пост)
в этом случае последний блок не вычитался бы

да, верно. я не прав


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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