LINUX.ORG.RU
ФорумAdmin

с какой либой собрать php c быстрой конкатенцией строк?


0

2

У меня есть скрипт, в котором поэтапно строится строка размером метров 16.

Я столкнулся с такой проблемой - под виндой этот скрипт (запускаю из консоли) отрабатывает раз в 1000 быстрее, чем под линухом. Опытным путем я вычислил, что тормозит именно конкатенция строк, причем, чем больше размер строки, тем сильней тормоза. пых 5.3.9 - только что обновил. memory_limit поставил 128мб. Пробовал так же использовать под линуксом виндозный php.ini - не помогло.

Скрипт под линуксом и виндой один и тот же.

Частичне решение проблемы было найдено путем использования оператора ".=". Но под виндой я спользовал медленную форму записи $a=$a.$b и все равно работало гораздо быстрей чем быстрая .= под линухом.

Я думаю, что тормоза связаны с тем, что в системе при компиляции php не стоит какой-то нужной либы, а стоит какая-то плохая либа. Но в какой либе может быть проблема? При отработке configure, он писал, что нету strlcpy и strlcat. Может, поэтому? какой apt-get надо сделать, чтобы оно появилось? Или это функции ядра?

пых под виндой собран в vc6, если это важно. Под виндой я его качал с сайта, а не собирал.



Последнее исправление: chabapok (всего исправлений: 1)

а других способов нет решить задачу? Имхо лучше в массив загонять кусочки чем делать конкатенацию которая часто вызывает realloc какой-нить и memcpy.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

есть - например написать на жаве

хочется же понять в чем проблема с пхп. Так это больше уже дело принципа, чем практическая задача. а как узнать с каким malloc-ом собран пых? (ну или какой маллок в системе стоит?)

chabapok
() автор топика
Ответ на: комментарий от chabapok

стоит стандартный.

Ты не в тот раздел запостил, попроси модеров в Development перенести.

Я подозреваю что у тебя вот эта проблема(не смотри что для питона написано): http://www.skymind.com/~ocrow/python_string/

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Да я понимаю, что это проблема связана с накладными раходами при выделении, перевыделении, копировании.

Но в данном посте речь не о том, как переписать скрипт и минимизировать эти расходы. Пути оптимизации скрипта - известны.

Речь о том, что на одном и том же скрипте в разных ОС наблюдается существенная разница производительности, на несколько порядков. Так быть не должно. Это значит, что под линуксом что-то где-то не правильно настроено.

chabapok
() автор топика

А если все элементы строки попробовать сначала запихать таки в массив, а потом ему сделать join()?

blind_oracle ★★★★★
()

Основную часть времени php проводит в функции memcpy. Можно попробовать заменить memcpy на что-то другое, но значительной прибавки не будет. На моём тестовом примере у меня получилось что-то около 32 гигов копирований за 6 секунд. Делим, множим на два, получаем 11 GiB/s при теоретическом пределе для одноканальной DDR3-1333 в 10 GiB/s. С учётом кэша вполне объяснимо. Фактически, из железа выжимается всё, что можно.

Так что про чудесатые ускорения на винде ты брешешь. Я не поленился и проверил: 30 секунд win(32) против 6 lin(64). На голом железе не проверял, смысла нет.

i-rinat ★★★★★
()
Ответ на: комментарий от chabapok

chabapok

хочется же понять в чем проблема с пхп

в том, что конкатенация в php оптимизирована для нормальных строк, а не для таких как у вас. В венде она видимо вообще никак не оптимизирована.

chabapok

пых под виндой собран в vc6, если это важно. Под виндой я его качал с сайта, а не собирал.

что-что?

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.