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


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

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

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

Онлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #15 : 05 Мая 2014, 23:19:23 »
hon, что у вас за комп, БЭСМ4?
Вот ваш код (модифицированный)
#include <stdio.h>
#include <time.h>

long myfunct(long a) {
long t;
  t = time(NULL);
  return t;
}
main() {
   long i;
   for (i = 0; i <= 1000000; ++i) {
       printf("%ld\n",myfunct(i));
   }
}
Команда
./a.out > a.txt
Файл a.txt - 10.5 МБ
Время выполнения - 1 сек. на нетбуке с процессором атом 1.6ГГц
ЧЯДНТ
Извините, я все еще учусь

Krjd

  • Гость
Re: Си. Быстрый вывод данных
« Ответ #16 : 05 Мая 2014, 23:53:08 »
вычисление простых чисел с одной особенностью
как рассчитать размер массива?
беглый гуглинг
http://ru.wikipedia.org/wiki/Теорема_о_распределении_простых_чисел

это я к тому что если чисел на выходе не астрономическое количество, то я бы записывал в файл только 1 раз..
« Последнее редактирование: 05 Мая 2014, 23:54:55 от D101101 »

Оффлайн hon

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1044
  • Ubuntu 12.04 LTS
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #17 : 05 Мая 2014, 23:58:24 »
Я запускаю свою программу командой
./proga 2 1000000 3И это занимает несколько часов времени. ЧЯДНТ?

Код моей программы:
#include <stdio.h>

//TODO: maxpower
unsigned long int getdivnumb(numb) {
  unsigned long int i, divnumb;
  divnumb = 2;
 
  for (i = 2; i <= (numb/2); i++) {
      if (numb % i == 0) {
         divnumb++;
      };
  }
  return divnumb;
}
main(int argc, char *argv[]) {
  unsigned long int i;
  unsigned long int max = atol(argv[2]);
  unsigned long int power = atol(argv[3]);
 
  for (i = atol(argv[1]); i < max; i++) {
      if (getdivnumb(i) == power) {
         printf("%lu\n",i);
      }
  }
}

Онлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #18 : 06 Мая 2014, 00:22:14 »
hon, "Заметил, что если закоментировать printf, то программа ускоряется в 20-25 раз." - ваши слова? Я вам просто показал, что printf одного числа в строку выполняется за 1/1000000 сек.
Так что вывод не тормозит вашу программу - все время уходит на алгоритм.
Извините, я все еще учусь

Оффлайн hon

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1044
  • Ubuntu 12.04 LTS
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #19 : 06 Мая 2014, 00:27:54 »
А как же тогда это?
Если выводить числа:
real 0m9.586s
user 0m8.600s
sys 0m0.000s
Если не выводить:
real 0m0.496s
user 0m0.300s
sys 0m0.000s
Может ли компилятор не вычислять условие if при отсутствии блока else и пустом then?

Krjd

  • Гость
Re: Си. Быстрый вывод данных
« Ответ #20 : 06 Мая 2014, 00:42:16 »
Может ли компилятор не вычислять условие if при отсутствии блока else и пустом then?
нет, он будет вычислять условие

Пользователь решил продолжить мысль 06 Мая 2014, 00:45:45:
Так что вывод не тормозит вашу программу - все время уходит на алгоритм.
я бы не был столь уверен, при большом количестве проходов вывод может не слабо замедлить
« Последнее редактирование: 06 Мая 2014, 00:46:37 от D101101 »

Онлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #21 : 06 Мая 2014, 00:46:35 »
hon, В вашем последнем коде я проверил, закоментировал printf - время работы практически не изменилось (90 сек. - ./a.out 2 100000 3 > a.txt)
Компилил gcc proga.c

я бы не был столь уверен, при большом количестве проходов вывод может не слабо замедлить
Это с чего такое может быть?
« Последнее редактирование: 06 Мая 2014, 00:49:11 от SergeyIT »
Извините, я все еще учусь

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #22 : 06 Мая 2014, 08:34:54 »
я бы не был столь уверен, при большом количестве проходов вывод может не слабо замедлить
Это с чего такое может быть?
Когда программа, скажем на 50% времени выполнения, состоит из printf, то замедление будет существенным.
В printf не слабое форматирование, с разбором аргументов и таких и сяких (особенно с плавающей арифметикой) ..., да сама функция мама не горюй.
Сам вывод на IO устройство тоже требует каких-то затрат, но об этом уже все давно забыли, многозадачность однако. Поэтому отладочные выводы в рабочей программе надо обязательно убирать, если критична производительность.

Krjd

  • Гость
Re: Си. Быстрый вывод данных
« Ответ #23 : 06 Мая 2014, 08:40:48 »
SergeyIT,
в добавок к выше сказанному, отрисовка в терминале тоже время, а
./a.out >> a.txtзаставляет bash работать с файлами, а как там это делается надо еще узнать..

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #24 : 06 Мая 2014, 08:50:58 »
SergeyIT,
в добавок к выше сказанному, отрисовка в терминале тоже время, а
./a.out >> a.txtзаставляет bash работать с файлами, а как там это делается надо еще узнать..
+1

Онлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #25 : 06 Мая 2014, 12:37:08 »
alexander.pronin, D101101, рассуждаете много... но это не для данного конкретного случая. В 1 примере я показал, что вывод 1000000 строк выполняется на моем нетбуке за 1 сек. Во 2-ом случае я убрал printf из проги ТС и увеличения скорости не обнаружил. Весь вывод у ТС тоже в файл, он в терминал не выводит. ЧЯДНТ?
PS
Накинулись тут, понимаешь ли :(... Хотя, может дело в ssd, пишет быстро - 200Мб/с.;)
Извините, я все еще учусь

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #26 : 06 Мая 2014, 17:44:38 »
На Си давно не писал, но хочу высказать
свою скромную точку мнения.
Нужен быстрый вывод (куда угодно) -
- ассемблер в руки, несколько подпрограмм,
и вопрос будет решен.
Тем более и Си и ассемблер очень хорошо
соединяются.
(Как вариант - пишите на Форте - результат будет точно).

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #27 : 06 Мая 2014, 17:53:37 »
Señor_Gaga,
я умею ассемблер только zx-spectrum.
Wars ~.o

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #28 : 06 Мая 2014, 18:49:30 »
Señor_Gaga,
я умею ассемблер только zx-spectrum.

Да, и zx-spectrum на ассемблере кодили.
(и на бейсике тоже).
Уже давно Си генерирует очень хороший код,
достаточно потратить 2-два часа почитать листинги.
---
Мне это сейчас не очень интересно.
Потихоньку в одиночку (кодю другой язык) -
кому нужно? Может быть ни кому.
Но мозгам засыхать не нужно.

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Си. Быстрый вывод данных
« Ответ #29 : 06 Мая 2014, 20:17:32 »
SergeyIT, да всё правильно. Если  в данной программе убрать вызов printf, то увеличение производительности будет незначительно, если вооще заметно. А вот код нахождения чисел нуждается в оптимизации, что как раз заметно скажется на производительности.

Навскидку исправлено то, что сразу вызывает сомнение:
Код: (c) [Выделить]
#include <stdio.h>

unsigned long int max;
unsigned long int power;

int getdivnumb(numb) {
    unsigned long int i, divnumb;
    divnumb = 2;
 
    for (i = 2; i <= (numb/2); i++) {
        if (numb % i == 0) {
            divnumb++;
            if (divnumb > power) {
                return 0;
            }
        };
    }
    return divnumb == power;
}

main(int argc, char *argv[]) {
    unsigned long int i;
    max = atol(argv[2]);
    power = atol(argv[3]);

    for (i = atol(argv[1]); i < max; i++) {
        if (getdivnumb(i)) {
            printf("%lu\n",i);
        }
    }
}

Этот код производительнее более, чем в 5 раз (при вызове с аргументами "2 200000 3").
« Последнее редактирование: 06 Мая 2014, 20:40:21 от unimix »

 

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