Доброго времени суток! Начал писать небольшую библиотеку по паскалевским строкам, без маляра Шлемиэля . Есть несколько вопросов: 1. Имеет ли это смысл - может есть уже хорошая отлаженная библиотека и я изобретаю очередной велосипед? 2. memcpy - есть ли нормальный способ решения? Все которые видел копируют побайтово даже на асме. У себя написал так: Код (Text): inline void memcpy(void* dst, void* src, size_t len) { __asm { mov esi, src mov edi, dst mov ecx, len rep movsb } } Но это все также побайтовое копирование. Помню на Z80 - старом проце, копирование одного блока памяти в другой выполнялось одной командой и занимало 4 такта. Здесь новейшие процы, а копирование побайтовое - может есть нормальное решение этого? 3. strlen - настолько ли быстр? Есть ли смысл пытаться писать свое?
Угу, четыре такта. ) Откуда взял что побайтово, так уже давно никто не копирует, в том числе и библиотечные функции.
ну может за 4 такта погорячился - давно это было - если не ошибаюсь LDIR команда, загружаем в регистры адреса, количество и LDIR выполняла ну ошибусь наверное по-моему около 20 тактов. Тем не менее - это достаточно быстро. Код (Text): rep movsb разве не побайтово? за решения типа Код (Text): while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; вообще молчу...
sivsoft Фейспалм на фейспалме и фейспалмом погоняет. Скажи честно, у тебя ведь нет реальной задачи, в которой strlen оказался ботлнеком, тебе просто нечем заняться?
_DEN_ есть - но хочется решить такую задачу - а что не так? сейчас занимаюсь DBF форматом, например, и уже достали эти строки - начал поиски решения - так понятней? З.Ы. Если уж так интересно - задачи для свободного времени - на работе есть свои - 1С, Базы + С++...
sivsoft Откуда ты взял этот код memcpy? Посмотри какой код генерит VS к примеру. Команда копирования памяти в speccy сама по себе занимает 20 или 30 тактов(точно тоже не помню), без учёта времени на работу с памятью. ) З.Ы strlen кроме как побайтно не реализовать.
_DEN_ это важно очень? если я делаю для какой-нить ТНК важную работу, то вы побежите сразу помогать, а если делаю для души то промолчите? З.Ы. чтобы удовлетворить ваш интерес - работа с DFB надобно для работы с 1С - некоторые операции делать напрямую заметно быстрее, но хочу (вот тут видите уже для души) сделать это на максимально-разумном низком уровне. На асме делать не буду по понятным причинам не буду, поэтому максимально низкий разумный уровень это C/C++ и WinAPI.
sivsoft Даже педивикия знает, что DBF - это устаревающий формат хранения данных. Но довольно перепалок, для меня диагноз уже очевиден.
И что с того - вы в астрале? Не знали что DBF используется до сих пор начиная с той же 1С и заканчивая разными отчетами? В общем иди в школу - учитель уже ждет... Ни одного полезного комментария, сообщения только для троленья Для меня ваш диагноз тоже очевиден... тролло
Booster Ага, вообще это очень хорошо, что ТС завел эту тему. Ведь такие нетривиальные алгоритмы как вычисление длины строки и пересылка блока памяти до сих пор не доведены до ума и нуждаются в оптимизации.
_DEN_ Я как раз писал что он не прав, но тем не менее практическую любую библиотечную функцию/алгоритм можно оптимизировать под конкретный случай. Ту же memcpy можно оптимизировать, к примеру под конкретный процессор.
Я просто задал вопрос и вместо того, чтобы разводить кучу бесполезных коментариев лучше бы ответили по существу - то есть: "я считаю так потому-то потому-то" Вместо этого вы даже ссылки не поленились поискать на разных "бакланов" и прочий интернет-сленг - это для вас видно очень важно, а по существу вопроса и по обсуждаемой теме ни одного ответа. Ведь это интереснее для вас, чем непосредственно программирование. З.Ы. Видно вы или еще в школе/институте учитесь или возраст зрелый но уровень до сих пор тот же школьный остался...
А вообще вопросом номер один стоял - паскалевские строки в С/С++ если где нормально реализованы подскажите библиотеку или буду писать сам.
Посмотрел - смысл такой же. Правда куча еще дополнительных проверок, так что при прочих равных скорость у Код (Text): inline void memcpy(void* dst, void* src, size_t len) { __asm { mov esi, src mov edi, dst mov ecx, len rep movsd // на него меняем + предусмотреть надо для оставшегося байта и movsb на последок } } будет примерно одинаковой. Если отвязываюсь от CRT (так как дизассемлил в итоге msvcr80d.dll) - код такой же останется?
sivsoft Ой, ну и что? Что, в 10-м классе человек не может хорошо разбираться в языке? Что вы чуть что сразу школой тыкаете?
_DEN_ Очевидно вас не в первый раз тыкают - потому как я вам об этом первый раз писал. Да человек может разбираться и в 5 классе в языке и быть хоть самым продвинутым гуру в нем, но поведение - а именно о нем я вам и говорил - может выдавать в нем школьника. На досуге посмотрите разницу между двумя очень похожими словами невежа и невежда. Это все не в обиду вам сказано, а с самыми лучшими чувствами.
sivsoft Ну видите - вы цепляетесь просто к самому факту того, что я еще учуть в школе, а не к тому, что я вам говорю про ваши вопросы по программированию.