Освободивший буфер ввод-вывод в ANSI C

Я сделал проведение испытаний петабайта с количеством других форматов данных (xml, json, сериализация объекта по умолчанию, гессиан, одна собственная) и библиотеки (jaxb, быстрый инфонабор, рукописный) для задачи привязки данных (и чтение и запись), но формат (форматы) экономии не был включен. Производительность для форматов с несколькими преобразователями (как xml) имела очень высокое различие от очень медленного до pretty-darn-fast. Корреляция между требованиями авторов и воспринятой производительности была довольно слаба. Особенно так для пакетов, которые предъявили самые дикие претензии.

Если это имеет значение, я нашел, что производительность петабайта была битом по раздутому (обычно не его авторами, но другими, которые только знают, кто записал это). С настройками по умолчанию это не разбило самую быструю текстовую xml альтернативу. С оптимизированным режимом (почему это не значение по умолчанию?), это был бит, быстрее, сопоставимый с самым быстрым пакетом JSON. Гессиан был довольно быстрым, текстовым json также. Двоичный формат Properietary (никакое имя здесь, это была внутренняя компания), было самым медленным. Сериализация объекта Java была быстра для больших сообщений, меньше для маленьких объектов (т.е. высоко зафиксировал noverhead на операцию). С петабайтом размер сообщения был компактен, но, учитывая все компромиссы необходимо сделать (данные не являются самодокументированными: при потере схемы Вы теряете данные; существуют индексы, конечно, и оценивают типы, но от того, что Вы имеете, перепроектируют назад к именам полей, если бы Вы хотите), я лично только выбрал бы его для определенных вариантов использования - чувствительный к размеру, тесно двойная система, где интерфейс/формат никогда (или очень очень редко) не изменяется.

Мое мнение в этом то, что (a) реализация часто имеет значение больше, чем спецификация (формата данных), (b) от начала до конца различия между лучшим среди аналогов (для различных форматов) являются обычно не достаточно большими для диктовки выбора. Таким образом, можно быть более обеспеченным выбором format+API/lib/framework, Вам нравится использовать большинство (или имеет лучшую поддержку инструмента), найдите лучшую реализацию и посмотрите, работает ли это достаточно быстро. Если (и только если!) не, рассмотрите затем лучшую альтернативу.

PS, Не уверенный, каков EJB3 здесь был бы. Возможно, просто сериализации Java?

8
задан Deduplicator 21 February 2015 в 17:37
поделиться

3 ответа

Придерживаться стандарта C в максимально возможной степени - это хорошая идея, но вы не собираетесь далеко продвигаться в принятой задаче, используя только стандарт C. Механизмы для получения символов из терминала по одному по своей сути являются зависит от платформы. Для систем POSIX (MacOS X) посмотрите заголовок . В старых системах для достижения аналогичных эффектов используется огромное количество заголовков и системных вызовов. Вам нужно будет решить, собираетесь ли вы выполнять какую-либо специальную обработку символов, помня, что такие вещи, как 'line kill' могут появиться в конце строки и уничтожить все введенные символы.

Для Windows: вам нужно углубиться в WIN32 API - в коде Unix и Windows практически не будет общего, по крайней мере, там, где вы переводите «терминал» в посимвольный режим. Если у вас есть механизм для чтения отдельных символов, вы можете управлять общим кодом - вероятно.

Кроме того, вам нужно будет беспокоиться о различиях между символами и нажатыми клавишами. Например, чтобы ввести «ï» в MacOS X, введите option-u и i . Это три нажатия клавиши.

Кроме того, вам нужно беспокоиться о различиях между символами и нажатыми клавишами. Например, чтобы ввести «ï» в MacOS X, введите option-u и i . Это три нажатия клавиши.

Кроме того, вам нужно беспокоиться о различиях между символами и нажатыми клавишами. Например, чтобы ввести «ï» в MacOS X, введите option-u и i . Это три нажатия клавиши.

5
ответ дан 5 December 2019 в 14:03
поделиться

Чтобы настроить небуферизацию открытого потока с помощью ANSI C, вы можете сделать это:

#include <stdio.h>
if (setvbuf(fd, NULL, _IONBF, 0) == 0)
  printf("Set stream to unbuffered mode\n");

(Ссылка: C89 4.9.5.6)

Однако после этого вы самостоятельно. : -)

5
ответ дан 5 December 2019 в 14:03
поделиться

Это невозможно при использовании только стандартного ISO C. Однако вы можете попробовать использовать следующие:

#include <stdio.h>
void setbuf(FILE * restrict stream, char * restrict buf); 

и связанные функции.

Лучше всего использовать библиотеку ncurses .

2
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: