Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Си. Быстрый вывод данных  (Прочитано 2826 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн hon

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1044
  • Ubuntu 12.04 LTS
    • Просмотр профиля
Си. Быстрый вывод данных
« : 05 Мая 2014, 16:31:16 »
Есть программа на си, которая десятки тысяч раз вызывает функцию с разными аргументами и выводит результат (число) через printf на стандартный вывод. Заметил, что если закоментировать printf, то программа ускоряется в 20-25 раз.
Как можно выводить данные быстрее?
Есть идея — накапливать все в памяти, а в конце распечатывать массив. Но как распечатать массив чисел без циклического вызова printf?

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #1 : 05 Мая 2014, 17:05:04 »
hon, а разве можно вывести массив без цикла?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #2 : 05 Мая 2014, 17:11:26 »
Непонятная задача... :-\
Извините, я все еще учусь

Оффлайн hon

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1044
  • Ubuntu 12.04 LTS
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #3 : 05 Мая 2014, 17:53:36 »
#include <stdio.h>
long myfunct(long a) {
    .........
}
main() {
   long i;
   for (i = 0; i <= 1000000; ++i) {
       printf("%d",myfunct(i));
   }
}

Если закомментировать printf, скорость выполнения повышается в 20-30 раз. Как повысить скорость выполнения, но чтобы программа продолжала выводить данные?
« Последнее редактирование: 05 Мая 2014, 17:55:24 от hon »

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #4 : 05 Мая 2014, 18:04:00 »
Очевидно же - не выводить данные, а писать в память (в файл), затем вывести отдельно...
Извините, я все еще учусь

Оффлайн golota

  • Участник
  • *
  • Сообщений: 132
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #5 : 05 Мая 2014, 18:58:52 »
   for (i = 0; i <= 1000000; ++i) {
       printf("%d",myfunct(i));
   }
}

Если закомментировать printf, скорость выполнения повышается в 20-30 раз. Как повысить скорость выполнения, но чтобы программа продолжала выводить данные?
Если это рабочий пример, то если закомментировать printf, то и myfunct не будет выполняться.
Естественно станет гораздо быстрее.
Я знаю то, что ничего не знаю, но некоторые не знают и этого. Сократ

Оффлайн hon

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1044
  • Ubuntu 12.04 LTS
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #6 : 05 Мая 2014, 19:18:45 »
   for (i = 0; i <= 1000000; ++i) {
       printf("%d",myfunct(i));
   }
}

Если закомментировать printf, скорость выполнения повышается в 20-30 раз. Как повысить скорость выполнения, но чтобы программа продолжала выводить данные?
Если это рабочий пример, то если закомментировать printf, то и myfunct не будет выполняться.
Естественно станет гораздо быстрее.

В оригинале несколько сложнее, над результатом функции еще производятся вычисления, а printf выводит лишь значение переменной.

Очевидно же - не выводить данные, а писать в память (в файл), затем вывести отдельно...

Это мне и нужно. Вопрос — как? Почему в файл а не в массив?

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #7 : 05 Мая 2014, 19:22:22 »
hon, как долго работает программа и в каком виде нужен вывод (неужели в текстовом)?
Извините, я все еще учусь

Оффлайн hon

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1044
  • Ubuntu 12.04 LTS
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #8 : 05 Мая 2014, 19:26:20 »
Программа работает обычно несколько часов. Продолжительности работы зависит от входных параметров. В результате работы программа генерирует файл от нескольких килобайт до мегабайт длиной. В выходном файле находятся строки, на каждой из которых записано по одному числу.
Низкая производительность программы (мегабайт в час) связана с тяжелыми вычислениями (вычисление простых чисел с одной особенностью).

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #9 : 05 Мая 2014, 19:35:17 »
hon, где у тебя в тексте вывод в файл? Неужели, если не выводить числа, программа работает несколько минут?
Извините, я все еще учусь

Оффлайн hon

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1044
  • Ubuntu 12.04 LTS
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #10 : 05 Мая 2014, 19:51:18 »
Программа пишет через printf на stdout, а я через bash перенаправляю вывод в файл так: ./proga > myfile
Или это замедляет работу?

Неужели, если не выводить числа, программа работает несколько минут?
Если выводить числа:
real 0m9.586s
user 0m8.600s
sys 0m0.000s
Если не выводить:
real 0m0.496s
user 0m0.300s
sys 0m0.000s
Взяты небольшие входные данные, чтобы не ждать несколько часов на работу первой программы.

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #11 : 05 Мая 2014, 21:34:52 »
Программа работает обычно несколько часов. Продолжительности работы зависит от входных параметров. В результате работы программа генерирует файл от нескольких килобайт до мегабайт длиной. В выходном файле находятся строки, на каждой из которых записано по одному числу.
Низкая производительность программы (мегабайт в час) связана с тяжелыми вычислениями (вычисление простых чисел с одной особенностью).
Мда... Вывод чисел в текстовый файл по одному числу на строку...

Делается просто: числа сохраняются в массиве (в памяти), по завершению работы программы (или по мере заполнения массива) массив сбрасывается в файл. Прям байтами и сбрасывается, без преобразования в текст. Читать такой файл побайтово (хоть 16 битные, хоть 32 битные, да хоть 64 битные числа) проблем не составит.
« Последнее редактирование: 05 Мая 2014, 21:37:56 от unimix »

Оффлайн hon

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1044
  • Ubuntu 12.04 LTS
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #12 : 05 Мая 2014, 21:46:39 »
unimix, как рассчитать размер массива? Ведь невозможно узнать, сколько простых чисел в неком промежутке, не найдя все числа.
Как записать такой массив чисел в файл без преобразования его элементов в строку?

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #13 : 05 Мая 2014, 22:09:40 »
Заготавливаем массив, пишем в него числа, пока он не заполнится.
Как заполнится, записываем в файл. Если массив большой, а результатов
мало, тоже не беда. Записываем часть массива, которая содержит
результаты, а «хвост» не пишем.

man fwrite:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);


прекрасно пишет любые данные любого объема в файл.
Делюсь знаниями, но их у меня мало!

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #14 : 05 Мая 2014, 22:24:52 »
В дополнение к выше сказанному inkblack.

При работе используется один массив, но он используется как буфер. Как массив наполнился, так данные массива сохраненяются в файл за одну операцию, счётчик буфера обнуляется и массив опять наполняется с начала. И так по кругу, пока работает программа.

 

Страница сгенерирована за 0.021 секунд. Запросов: 21.