Почему действительно отзывается эхом> использование файла более реальное время, чем эхо | sed> файл?

Для выполнения файла банки передайте -jar опция к Java. Иначе это предполагает, что данным аргументом является название класса, не название файла банки (конкретно в этом случае, это ищет названный класс jar в пакет iCChecker).

Так java -jar iCChecker.jar будет работать.

28
21.08.2012, 02:35
1 ответ

у bahamat и Alan Curry есть он правильный: это происходит из-за способа, из которого Ваша оболочка буферизует вывод echo. А именно, Ваша оболочка является ударом, и это выпускает тот write системный вызов на строку. Следовательно первый отрывок делает 1 000 000 записей к дисковому файлу, тогда как второй отрывок делает 1 000 000 записей к каналу и sed (в основном параллельно, если у Вас есть несколько центральных процессоров), делает значительно меньшее число записей к дисковому файлу из-за его выходной буферизации.

Можно наблюдать то, что продолжается путем выполнения strace.

$ strace -f -e write bash -c 'echo -n a\ {1..2}\ c$'\'\\n\'' >file'
write(1, "a 1 c\n", 6)                  = 6
write(1, " a 2 c\n", 7)                 = 7
$ strace -f -e write bash -c 'echo -n a\ {1..2}\ c$'\'\\n\'' | sed "s/^ //" >file'
Process 28052 attached
Process 28053 attached
Process 28051 suspended
[pid 28052] write(1, "a 1 c\n", 6)      = 6
[pid 28052] write(1, " a 2 c\n", 7)     = 7
Process 28051 resumed
Process 28052 detached
Process 28051 suspended
[pid 28053] write(1, "a 1 c\na 2 c\n", 12) = 12
Process 28051 resumed
Process 28053 detached
--- SIGCHLD (Child exited) @ 0 (0) ---

Другие оболочки, такие как ksh буферизуют вывод echo даже когда это - мультилиния, таким образом, Вы не будете видеть большую часть различия.

$ strace -f -e write ksh -c 'echo -n a\ {1..2}\ c$'\'\\n\'' >file'
write(1, "a 1 c\n a 2 c\n", 13)         = 13
$ strace -f -e write ksh -c 'echo -n a\ {1..2}\ c$'\'\\n\'' | sed "s/^ //" >file'
Process 28058 attached
[pid 28058] write(1, "a 1 c\n a 2 c\n", 13) = 13
Process 28058 detached
--- SIGCHLD (Child exited) @ 0 (0) ---
write(1, "a 1 c\na 2 c\n", 12)          = 12

С ударом я получаю подобные отношения синхронизации. С ksh я вижу, что второй отрывок работает медленнее.

ksh$ time echo -n a\ {1..1000000}\ c$'\n' >file

real    0m1.44s
user    0m1.28s
sys     0m0.06s
ksh$ time echo -n a\ {1..1000000}\ c$'\n' | sed "s/^ //" >file

real    0m2.38s
user    0m1.52s
sys     0m0.14s
29
27.01.2020, 19:39
  • 1
    Спасибо... Это длится ksh пример больше вроде того, что я ожидал... –  Peter.O 21.08.2012, 03:05

Теги

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