Эффективное программирование чтения stdin c

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

unsigned char *msg; size_t msgBytes = 0; size_t inputMsgBuffLen = 1024; if ( (msg = (unsigned char *) malloc(sizeof(unsigned char) * inputMsgBuffLen) ) == NULL ) { quitErr("Couldn't allocate memmory!", EXIT_FAILURE); } for (int c; (c = getchar()) != EOF; msgBytes++) { if (msgBytes >= (inputMsgBuffLen)) { inputMsgBuffLen <<= 1; if ( ( msg = (unsigned char *)realloc(msg, sizeof(unsigned char) * inputMsgBuffLen) ) == NULL) { free(msg); quitErr("Couldn't allocate more memmory!", EXIT_FAILURE); } } msg[msgBytes] = (unsigned char)c; } 

Вопрос: читаете ли вы двоичные или текстовые данные из stdin ? Если текст, почему вы используете unsigned char ?

Некоторые советы:

  1. Бросьте все броски на malloc и realloc ; они не нужны и загромождают код;
  2. Вместо повторного вызова getchar используйте fread или fgets (в зависимости от того, читаете ли вы двоичный или текстовый);
  3. Помните, что realloc может потенциально вернуть NULL, поэтому вы хотите присвоить результат временному значению, иначе вы потеряете исходный указатель и завершите утечку памяти;
  4. Используйте статически выделенный буфер для каждого fragmentа ввода;
  5. Используйте sizeof для объектов, а не для типов; он немного чище, и он защищает вас в случае изменения типов (например, T *p = malloc(sizeof *p * number_of_elements);

Убрана версия, предполагающая, что вы собираетесь использовать символы без знака:

 #define inputBufSize 1024 unsigned char *msg = NULL; size_t msgBytes = 0; size_t inputMsgBufSize = 0; unsigned char inputBuffer[inputBufSize]; size_t bytesRead = 0; while ((bytesRead = fread( inputBuffer, // target buffer sizeof inputBuffer, // number of bytes in buffer 1, // number of buffer-sized elements to read stdin)) > 0) { unsigned char *tmp = realloc(msg, inputMsgBufSize + bytesRead)); if (tmp) { msg = tmp; memmove(&msg[inputMsgBufSize], inputBuffer, bytesRead); inputMsgBufSize += bytesRead; } else { printf("Ran out of memory\n"); free(msg); break; } } 

Попробуйте прочитать фиксированные куски не менее 8192 байт. Не используйте одиночный ввод, поскольку он довольно медленный.

Почему вы хотите «оптимизировать» код?

У вас было время?
Вы находили, что это было слишком медленно?
Готовы ли вы к новым версиям?
Вы понимаете, что время выполнения кода зависит от многих факторов (например, текущая загрузка процессора, количество активных пользователей, активность диска, …, …)

Лучшая оптимизация, которую вы можете сделать, начинается с очень большого значения для malloc (и, возможно, realloc down после того, как все данные были прочитаны).

 size_t inputMsgBuffLen = 400000000; /* approx 400 mega */