Почему моя функция “кошки” с системными вызовами медленнее по сравнению с “кошкой” Linux?

Я не знаю, почему это работает, но вам придется

  1. добавить chromedriver.exe к вашему решению, щелкнув правой кнопкой мыши и выбрав добавить существующее.
  2. в свойствах файла выберите в разделе «Копировать в каталог вывода» «Копировать всегда» или «Копировать, если новее»

Вот и все. Это должно работать.

12
задан Bill the Lizard 16 September 2012 в 22:25
поделиться

6 ответов

Ах, на основании вашего редактирования вы были укушены буфером чтения заголовка. Вы не можете протестировать две программы, которые читают файлы рядом, запустив их один раз. Первый всегда медленнее, так как файл находится на диске, как только файл находится в памяти, второй будет работать быстрее, вы должны либо создать новые данные для каждого, либо запустить один, а затем запустить оба, чтобы они оба получили преимущество буфера readahead.

15
ответ дан 2 December 2019 в 06:10
поделиться

В 2017 году csv полностью указан - RFC 4180.

Это очень распространенная спецификация, полностью охватываемая многими библиотеками (пример ).

Просто используйте любую легкодоступную библиотеку csv - то есть RFC 4180.


На самом деле есть спецификация для формата CSV и способ обработки запятых:

Поля, содержащие разрывы строк (CRLF), double кавычки и запятые должны быть заключены в двойные кавычки.

http://tools.ietf.org/html/rfc4180

Таким образом, чтобы иметь значения foo и bar, baz , вы делаете это:

foo,"bar,baz"

Еще одно важное требование для рассмотрения (также из спецификации):

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

 «aaa», «b», «bb», «ccc»
- 121 --- 1802901--

Начните с файла, содержащего нисходящие числа от максимально интересующего вас максимума:

7 6 5 4 3 2 1

Затем ... это работает только до 9999

#!/bin/sh
MAX_NUM=9999
if [ ! -e descendingnumbers.txt ]; then
    seq -f%04.0f -s\  $MAX_NUM -1 1 > descendingnumbers.txt
fi
tail descendingnumbers.txt -c $[5 * $1]
- 121 --- 2227188--

Исследуйте mmap (2).

Вы будете отбрасывать тонкости ftell / fread, но он пропустит слой косвенности, если пропускная способность чтения действительно важна.

3
ответ дан 2 December 2019 в 06:10
поделиться

Возможно, вы скомпилировали без оптимизации (или без такой высокой настройки оптимизации)?

Также ваш код вызовет sysWriteBuffer один раз с readBytes равным нулю - может, это (частично) объясняет это?

Вы также можете встроить sysWriteBuffer (либо с помощью переключателя компилятора, либо вручную). ] «встраивание» означает копирование тела функции на сайт вызова с целью устранения накладных расходов на вызов функции. Иногда компиляторы делают это автоматически (я думаю, что -O3 включает эту оптимизацию в gcc). Вы также можете использовать ключевое слово inline в gcc , чтобы указать компилятору встроить функцию. Если вы сделаете это, ваша декларация будет выглядеть так:

static inline int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
....
3
ответ дан 2 December 2019 в 06:10
поделиться

Без сравнения исходных кодов сложно сказать. Если вы сравниваете свою кошку с GNU cat, помните, что вы сравниваете код, которому несколько часов / дней, с кодом, который развивался более двадцати лет.

Возможно, вы захотите провести более полный анализ производительности, запуск обеих программ с разными размерами ввода, с разных устройств (неплохо было бы использовать RAM-диск) и несколько раз подряд. Вы должны попытаться определить, ГДЕ в вашей программе медленнее.

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

2
ответ дан 2 December 2019 в 06:10
поделиться

Сколько? Канонический кот - что-то вроде

char bufr[BUFSIZ];
ssize_t len;

while((len=read(fdin, bufr, BUFSIZ)) >0)
     write(fdout, bufr, len);

, который сохраняет несколько инструкций.

1
ответ дан 2 December 2019 в 06:10
поделиться

Вы сравнивали strace с обоих? Вы можете попробовать использовать параметр -tt , чтобы получить время системных вызовов.

1
ответ дан 2 December 2019 в 06:10
поделиться
Другие вопросы по тегам:

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