Более быстрый ввод-вывод в C

1114 У вас все не так. Это намного проще, чем вы думаете.

function getValues(collectionName, docName) {
    return db.collection(collectionName).doc(docName).get().then(function (doc) {
        if (doc.exists) return doc.data().text;
        return Promise.reject("No such document");
    }};
}

Если функция возвращает обещание (например, db.collection(...).doc(...).get()), верните это обещание. Это «внешний» return выше.

В обработчике обещаний (внутри обратного вызова .then()) возвращают значение, указывающее на успех, или отклоненное обещание, указывающее на ошибку. Это «внутренний» return выше. Вместо возврата отклоненного обещания вы также можете throw выдать ошибку, если хотите.

Теперь у вас есть функция возврата обещаний. Вы можете использовать его с .then() и .catch():

getValues('configuration','helpMessage')
    .then(function (text) { console.log(text); })
    .catch(function (err) { console.log("ERROR:" err); });

или await внутри функции async в блоке try / catch, если вам это нравится больше:

[ 112]

Если вы хотите использовать async / await с вашей функцией getValues(), вы можете:

async function getValues(collectionName, docName) {
    let doc = await db.collection(collectionName).doc(docName).get();
    if (doc.exists) return doc.data().text;
    throw new Error("No such document");
}
7
задан unwind 1 April 2009 в 13:07
поделиться

7 ответов

Используйте fgets (...) для получения по запросу в строке за один раз. Обратите внимание, что необходимо проверить на '\n' в конце строки, и если нет один, Вы или в EOF, или необходимо считать ценность другого буфера и связать два вместе. Пена, промывка, повторяется. Не становитесь пойманными с переполнением буфера.

ЗАТЕМ можно проанализировать каждую логическую строку в памяти сами. Мне нравится использовать strspn (...) и strcspn (...) для этого вида вещи, но Ваш пробег может варьироваться.

Парсинг: Определите строку разделителей. Используйте strspn () для подсчета "не данных" символами, которые соответствуют разделителям и перескакивают через них. Используйте strcspn () для подсчета символов "данных", которые НЕ соответствуют разделителям. Если это количество 0, Вы сделаны (больше никаких данных в строке). Иначе скопируйте те символы N для вручения функции парсинга, такой как atoi (...) или sscanf (...). Затем сбросьте свою базу указателя в конец этого блока и повторите пропуск-delims, данные копии, convert-numeric процесс.

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

Вы используете несколько reads с буфером фиксированного размера, пока Вы не поражаете конец файла.

3
ответ дан 6 December 2019 в 14:09
поделиться

Используйте двоичный ввод-вывод, если Вы можете. Текстовое преобразование может замедлить чтение несколько раз. Если Вы используете текст ввод-вывод, потому что легко отладить, рассмотреть снова двоичный формат и использовать программу передозировки (предполагающий, что Вы находитесь на Unix) сделать это человекочитаемым при необходимости.

О, другая вещь: существует библиотека AT&T SFIO, которая поддерживает более безопасный/быстрее файл IO. У Вас могла бы также быть некоторая удача с этим, но я сомневаюсь, что Вы получите тот же вид ускорения, как Вы будете с двоичным форматом.

2
ответ дан 6 December 2019 в 14:09
поделиться

Если Ваш пример является представительным, что у Вас действительно есть фиксированный формат пяти десятичных чисел на строку, я, вероятно, использовал бы комбинацию fgets() считать строки, затем вызов цикла strtol() преобразовать от строки до целого числа.

Это должно быть быстрее, чем scanf(), в то время как еще более ясный и более высокоуровневый, чем выполнение строки к целочисленному преобразованию самостоятельно.

Что-то вроде этого:

typedef struct {
  int number[5];
} LineOfNumbers;

int getNumbers(FILE *in, LineOfNumbers *line)
{
  char buf[128];  /* Should be large enough. */
  if(fgets(buf, sizeof buf, in) != NULL)
  {
    int i;
    char *ptr, *eptr;

    ptr = buf;
    for(i = 0; i < sizeof line->number / sizeof *line->number; i++)
    {
      line->number[i] = (int) strtol(ptr, &eptr, 10);
      if(eptr == ptr)
        return 0;
      ptr = eptr;
    }
    return 1;
  }
  return 0;
}

Примечание: это не тестируется (даже нескомпилированный!) записанный из браузера код. Но возможно полезный как конкретный пример.

3
ответ дан 6 December 2019 в 14:09
поделиться

Считайте строку за один раз (если буфер, не достаточно большой для строки, разверните и продолжите более крупный буфер).

Затем используйте выделенные функции (например, atoi), а не общий для преобразования.

Но, больше всего, настроенный повторяемая тестовая обвязка с профилированием для обеспечения изменений действительно приводят в порядок вещи скорости.

1
ответ дан 6 December 2019 в 14:09
поделиться

Из любопытства, что генерирует это много строк что быстро в консоли?

0
ответ дан 6 December 2019 в 14:09
поделиться

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

Я нашел на самых быстрых способов читать, файл похож на это:

/*seek конец файла */fseek (файл, 0, SEEK_END);

/*get размер файла */размер = ftell (файл);

/*seek запустите файла */fseek (файл, 0, SEEK_SET);

/* сделайте буфер для файла */буфером = malloc (1048576);

/*fread в 1 МБ за один раз, пока Вы не достигаете байтов размера и т.д. */

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

По крайней мере необходимо использовать освобожденный с размерами блока, столь большими, как Вы можете, и по крайней мере столь же большой как блоки данных кэша или размер сектора жесткого диска (4 096-байтовый минимум, я использовал бы 1048576 в качестве минимума лично). Вы найдете, что с намного большим чтением requsts rfead может последовательно получить большой поток в одной операции. Предложение здесь некоторых людей для использования 128 байтов смешно...., поскольку Вы закончите с диском, имеющим необходимость искать все время, когда крошечная задержка между вызовами заставит голову уже проходить следующий сектор, который почти наверняка имеет последовательные данные, которые Вы хотите.

0
ответ дан 6 December 2019 в 14:09
поделиться
Другие вопросы по тегам:

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