Anonymous
Ну, в доках сказано, что один из потоков может быть прерван посередине вычисления IO-действия и никакого исключения по этому поводу порождено не будет
Anonymous
(хорошо ещё никто на STG писать не стал)
A64m
а какой механизм прерывания-то?
Алексей
а расскажите в каких ситуациях вы используете fixed-vector-hetero?
Ну я его написал просто как естественное обобщение fixed-vector, так что мне тоже интересно.
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 отличаются?
Vadim
@nightblues где? я отсюда последнюю скопипастил выше по треду
я ее изменил после отправки) давай так: https://gist.github.com/NightBlues/ff0eb61480e5deed83db902fcdf42f0a
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
分解物質
@yellow_apple нет причин не работать
но ведь входной размер слова == 5
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
но!