The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Для ядра Linux предложена реализация функции memchr, работающая до 4 раз быстрее, opennews (??), 12-Июл-22, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


131. "Для ядра Linux предложена реализация функции memchr, работаю..."  +/
Сообщение от qwe (??), 13-Июл-22, 15:26 
>        -Wno-stringop-overread
>            Warn for calls to string manipulation functions such as "memchr", or "strcpy" that are
>            determined to read past the end of the source sequence.

И как сие работает? Сдается мне, что эта опция совсем не для этого. Я имею ввиду, что часто нет необходимости вычислять всю длину строки, и при сравнении длины строки с N можно дальше N+1 байта не ходить, что очень даже полезно в случае, если строка очень большая.

Ответить | Правка | Наверх | Cообщить модератору

138. "Для ядра Linux предложена реализация функции memchr, работаю..."  +/
Сообщение от n00by (ok), 13-Июл-22, 19:40 
Да, опция для другого. Задействованный механизм позволяет иногда оптимизировать чуть лучше:

$ cat test.c
#include <string.h>

int test(const char* s)
{
  return strlen(s) == 5;
}

int main()
{
  return test("12345");
}

$ gcc -o test.s test.c -S -O2
$ cat test.s

test:
    subq    $8, %rsp
    call    strlen@PLT
    cmpq    $5, %rax
    sete    %al
    addq    $8, %rsp
    movzbl    %al, %eax
    ret

main:
    movl    $1, %eax // strlen вообще не вызывается
    ret


В асм листинге вырезал нерелевантный текст.

То, что Вы предлагаете - это не наивная оптимизация. Подсчёт кол-ва символов в строке помещает всю строку в кеш. Если её длина больше 5 - может именно это программисту и надо?

Ответить | Правка | Наверх | Cообщить модератору

140. "Для ядра Linux предложена реализация функции memchr, работаю..."  +/
Сообщение от qwe (??), 13-Июл-22, 20:38 
Чуть лучше, только если строка - это константа. Что же касается строки

strlen(s) == 5

То тут довольно очевидно что именно программисту нужно. По крайней мере когда результат выполнения strlen никуда не сохраняется.

Ответить | Правка | Наверх | Cообщить модератору

149. "Для ядра Linux предложена реализация функции memchr, работаю..."  +/
Сообщение от n00by (ok), 14-Июл-22, 17:28 
Мне не очевидно, даже не знаю, когда такое может потребоваться и почему в реальной задаче нельзя проверить s[5].
Ответить | Правка | Наверх | Cообщить модератору

153. "Для ядра Linux предложена реализация функции memchr, работаю..."  +/
Сообщение от qwe (??), 14-Июл-22, 18:43 
> Мне не очевидно, даже не знаю, когда такое может потребоваться и почему
> в реальной задаче нельзя проверить s[5].

Что если длина строки 2 а память, где хранится строка, перед этим была обнулена? А что если проверяемая длина лежит за границей выделенного блока памяти? Вы точно знаете как именно организованы строки в Си?

Ответить | Правка | Наверх | Cообщить модератору

154. "Для ядра Linux предложена реализация функции memchr, работаю..."  +/
Сообщение от n00by (ok), 15-Июл-22, 06:33 
>> Мне не очевидно, даже не знаю, когда такое может потребоваться и почему
>> в реальной задаче нельзя проверить s[5].
> Что если длина строки 2 а память, где хранится строка, перед этим
> была обнулена?

Вот поэтому и пишу "в реальной задаче". Могу придумать гипотетическую задачу, где надо как-то сгруппировать строки по длине. В таком случае эти нули окажутся проверены на предыдущих шагах.

> А что если проверяемая длина лежит за границей выделенного
> блока памяти?

Это частный случай вышеуказанного. В том числе и если по виртуальному адресу нет физической памяти.

> Вы точно знаете как именно организованы строки в Си?

Как считает целесообразным для решения задачи программист, так и организует. Если часто нужна длина, она не вычисляется каждый раз, а хранится отдельно. На практике, если программа более-менее серьёзно работает с текстом, strlen оказывается в каких-то вспомогательных местах, если вообще есть.

Ответить | Правка | Наверх | Cообщить модератору

155. "Для ядра Linux предложена реализация функции memchr, работаю..."  +1 +/
Сообщение от qwe (??), 15-Июл-22, 13:16 
Я спрашиваю про конкретную оптимизацию при использовании конкретной функции из стандартной библиотеки, вы же отвечаете непонятно на что, затем придумываете гипотетические задачи, в которых эта функция не используется вовсе. Если я вызываю strlen(s), то это означает, что мне неизвестна длина строки (внешние данные), а если я вызываю strnlen(s, 6), это означает что мне не нужна точная длина строки, я лишь хочу убедится, что ее длина больше 5.
Ответить | Правка | Наверх | Cообщить модератору

160. "Для ядра Linux предложена реализация функции memchr, работаю..."  +/
Сообщение от n00by (ok), 16-Июл-22, 07:17 
> Я спрашиваю про конкретную оптимизацию при использовании конкретной функции из стандартной
> библиотеки, вы же отвечаете непонятно на что,

А я увидел человека, кто не может сгенерировать ассемблерный листинг и изучить его.

> затем придумываете гипотетические задачи,
> в которых эта функция не используется вовсе.

Потому что реальную задачу Вы не показали.

> Если я вызываю strlen(s),
> то это означает, что мне неизвестна длина строки (внешние данные), а

Вот именно. На практике для каждой такой строки определяется её длина. Если требуется эффективно находить строки длиной 5 - их длина оказывается уже посчитана при проверке входных данных.

> если я вызываю strnlen(s, 6), это означает что мне не нужна
> точная длина строки, я лишь хочу убедится, что ее длина больше
> 5.

В №75 написано: if (strlen(s) == 5) --> if (strnlen(s, 6) == 5)

Изначально Вы искали строки длиной равной 5 и интересовались, способен ли транслятор заменить вызов стандартной функции на функцию, о которой он ничего не знает.

Вы, наверное, удивитесь, но:
1. в стандарте есть только strnlen_s (определена ли она по умолчанию - implementation defined);
2. исходники популярной программы GNU bash содержат файл bash/lib/sh/strnlen.c с реализацией strnlen.

Ответить | Правка | Наверх | Cообщить модератору

161. "Для ядра Linux предложена реализация функции memchr, работаю..."  +1 +/
Сообщение от qwe (??), 16-Июл-22, 12:31 
> А я увидел человека, кто не может сгенерировать ассемблерный листинг и изучить
> его.

А если человек сгенерировал, изучил, но вам не доложил, как вы его отличите от того, кто не смог? Так вот, если вашей функции test выше скормить программно заполненный массив символов, то в asm листинге таки будет виден вызов strlen. Сюрприз? Мне почему-то показалось, что доказывать это нет необходимости. Мне не нужен вызов strlen("12345"), ибо чтобы узнать результат этого вызова компьютер не нужен. Я спрашивал о strlen(s), где s - это переменная, а не константа, зашитая в коде. Но не напрягайтесь, сейчас мне ваш ответ не нужен, только не после демонстрации вами вашей логики.

Ответить | Правка | Наверх | Cообщить модератору

162. "Для ядра Linux предложена реализация функции memchr, работаю..."  +/
Сообщение от n00by (ok), 16-Июл-22, 13:18 
>> А я увидел человека, кто не может сгенерировать ассемблерный листинг и изучить
>> его.
> А если человек сгенерировал, изучил, но вам не доложил, как вы его
> отличите от того, кто не смог?

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

> Так вот, если вашей функции
> test выше скормить программно заполненный массив символов, то в asm листинге
> таки будет виден вызов strlen. Сюрприз? Мне почему-то показалось, что доказывать
> это нет необходимости.

Действительно, сюрприз. В том листинге, что я привёл, в test() есть вызов strlen. Но в main() нет вызова test(). Я полагал, что нет смысла объяснять очевидные вещи.

> Мне не нужен вызов strlen("12345"), ибо чтобы узнать
> результат этого вызова компьютер не нужен. Я спрашивал о strlen(s), где
> s - это переменная, а не константа, зашитая в коде. Но
> не напрягайтесь, сейчас мне ваш ответ не нужен, только не после
> демонстрации вами вашей логики.

Я и не напрягаюсь. Спрашивающий настрочил 4 ответа, но затруднился показать реальный пример со (strlen(s) == 5) - значит он такое никогда не писал. А раз даже он не писал, то и оптимизировать нет смысла.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру