Anonymous
Ну, в доках сказано, что один из потоков может быть прерван посередине вычисления IO-действия и никакого исключения по этому поводу порождено не будет
Anonymous
(хорошо ещё никто на STG писать не стал)
A64m
а какой механизм прерывания-то?
Anonymous
да, но второе могло делать несколько действий (bracket?), которые второй тред _частично_ выполнил и сдох
Vadim
@nightblues ну я не знаю, где - но вывод перевернутый
пофиксил - md5 совпадает eb8d32c8d260d240b351dfadd42cb5e5
let read_line () =
try
Some (read_line ())
with End_of_file -> None
let read_lines () =
let rec loop acc =
match read_line () with
| None -> List.rev acc
| Some line -> loop (line::acc)
in loop []
let cut_r s =
let stop =
try String.index s '\r' with Not_found ->
try String.index s '\n' with Not_found ->
String.length s
in
(String.sub s 0 stop) ^ "\n"
let get_pair line =
match String.split_on_char ' ' line with
| [prefix; suffix] -> (prefix, cut_r suffix)
| _ -> failwith "Invalid input"
let unzip pairs =
let p, s = List.fold_left (fun (ltl, rtl) (left, right) -> (left::ltl, right::rtl)) ([], []) pairs in
(List.rev p, List.rev s)
let () =
let lines = read_lines () in
let lines = List.map get_pair lines in
let prefixes, suffixes = unzip lines in
let buf_size = 160000 in
let buf = Buffer.create buf_size in
let show prefix suffix =
if Buffer.length buf > buf_size - 10 then
(Buffer.output_buffer stdout buf; Buffer.clear buf);
Buffer.add_string buf prefix;
Buffer.add_string buf suffix
in
List.iter (fun p -> List.iter (show p) suffixes) prefixes;
Buffer.output_buffer stdout buf
время у меня:
real 0m1.805s
user 0m1.796s
sys 0m0.004s
Alexander
https://paste.pound-python.org/show/WGv8D0Srwn4K2n9M5pJW/
qnikst@qwork ~ $ ./1
(0,0)
Alexander
хотя второй тред должен был словить исключение
Dmitry
@nightblues 0m3.798s
Alexander
grey holes в продакшен запилили?
Alexander
@A64m_qb0 ^
Vadim
@nightblues 0m3.798s
я подредактировал немного - попробуй новую. \n один раз для каждого суфикса добавляю)
A64m
не знаю
Alexander
проидее с ними второй тред может быть остановлен на середине
Dmitry
@nightblues где? я отсюда последнюю скопипастил выше по треду
Alexander
не знаю как это протестировать
Dmitry
но думаю, что принципиальной разницы не будет (различимой)
A64m
в этих пейперах никогда не знаешь, что в конце концов в компиляторе оказалось и что по умолчанию включили
Anonymous
@qnikst greyholes чем от обычных blackholes отличаются?
Alexander
blackholes грубо говоря лок, другой тред попадает туда и ждет пока первый выполнит
Alexander
grey - тред может начать выполнение, но переодически может проверять не выполняет ли другой и вываливается если так
Dmitry
@nightblues 2.8
分解物質
@qnikst почему это работает?
if (len>8) {
memcpy(current,word,len);
} else {
memcpy(current,word,8);
}
Alexander
фишка в том, что если вычисление дешевое, то быстрее если оба выполнят
Alexander
@yellow_apple нет причин не работать
Dmitry
@yellow_apple а почему ему не работать?
Vadim
@nightblues 2.8
а хаскель сколько? у меня для окамла результаты такие
real 0m1.803s
user 0m1.800s
sys 0m0.000s
Dmitry
@nightblues v-stream - 1.6
Dmitry
1.6
分解物質
Dmitry
там в буфере запас сделан, что бы мимо не писать
Alexander
ну скопировали немного мусора, что с того
Dmitry
зато запись выровненная
Alexander
угу
Dmitry
интересно, а волгринд что скажет?
Alexander
и сдвиг на правильный размер
Alexander
а чего он сказать может, там все честно
Alexander
у меня последовательный вектор, и я копирую не выходя за границы
Dmitry
там, по идее, можно скопировать откуда-то, которое меньше, чем эти +8 байт
Dmitry
или невозможно?
Alexander
у меня - нет
Dmitry
у меня - да, но это можно подкорректировать чанки
Alexander
там проверяется что buffer_size>real_size+8
分解物質
Alexander
@voidlizard у тебя кстати ещё круче (задаче где большие слова могут быть) можно у тебя же мелкие строки inline хранятся, то можно 3 специлизации 8,16,24
Alexander
ну что там разумно
Dmitry
ну в нашем случае чанк 5
Anonymous
столько написали, что и не перечитать. "вашу бы энергию, да в мирных целях" (с)
Alexander
ну да
Dmitry
а не в нашем случае - ДАНУНАХЕР
Dmitry
сколько ж можно
Alexander
=)
Dmitry
у меня зато крутое хранение размера чанков
Dmitry
но никто не оценил
Alexander
я ктати подробно не вглядывался
Alexander
надо посмотреть
Dmitry
там в ext - "генерация" чанка. 0 - живут на стеке и их нельзя realloc
Dmitry
1 - указатель на чанк на хипе
Dmitry
все, что выше - уже реаллоцированные чанки
Dmitry
размер вычисляется как сдвиг на размер поколения
Dmitry
таким образом не храню отдельно тип чанка и размер чанка
Dmitry
экономия
Alexander
да мы с @A64m_qb0 вроде это обсуждали
Alexander
я бы ужаснее запилил
Dmitry
как?
Dmitry
битовое поле?
Dmitry
с тегами/размерами и анпаком?
Dmitry
гиморно, много движений делать
Alexander
union (указатель, размер, оффсет) (char[31] + последнем бите тег, последний байт под размер inline строки (кроме бита, там свиг), )
Alexander
как-то так
Alexander
т.е. примерно что у тебя но кривее, ещё бы и с синтаксиом union запутался бы, я его всегда заново гуглю
A64m
причем я-то это на хаскеле хотел писать
Alexander
ага
Dmitry
и фибоначчи-реаллок. правда все равно не помогло ничего )
Dmitry
ну и ладно, не совсем фибоначчи
A64m
я думаю так строки в хештаблице хранить, там должно помоч
Dmitry
но почти.
Alexander
кстати по совету Kirill я заглянул в hackage://memory там есть что надо
Alexander
но!