LINUX.ORG.RU

как сделать быстрее? memcpy vs sprintf vs ...?


0

0

нужно из кусков собрать буфер, как это сделать сделав как можно меньше системных вызовов?
например...
memcpy(buffer, method, sizeof(method));
memcpy(buffer, url, sizeof(url));
memcpy(buffer, "HTTP/1.0\r\n", sizeof("HTTP/1.0\r\n"));
В общем нужно собрать http-заголовок, возможно есть более удобные, быстрые методы, подскажите плиз...

anonymous

Ни memcpy ни sprintf не являются системными вызовами. А вообще вряд ли что то быстрее memcpy будет.

Legioner ★★★★★
()

> нужно из кусков собрать буфер, как это сделать сделав как можно меньше системных вызовов?

их там и так ноль:)

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

>> А вообще вряд ли что то быстрее memcpy будет.

Скорее всего будет быстрее, если копировать с помощью SIMD'ов. Например функциями из liboil.

А вообще да, код в первом посте неправильный (точнее он делает не то, что хочет от него аффтор =)).

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

->А вообще да, код в первом посте неправильный (точнее он делает не то, что хочет от него аффтор =)).
ну да, наверно нужно что-то вроде этого...
memcpy(buffer+sizeof(method), method, sizeof(method)); 

->Скорее всего будет быстрее, если копировать с помощью SIMD'ов. Например функциями из liboil. 
можно пример?

anonymous
()

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

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

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

об бы лучше озаботился с работой sizeof(foo). в противном случае, выравнивание будет уже не актуальным.

// wbr

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

> Быстрее всего иметь уже готовый http-заголовок :)

быстрее всего иметь уже готовый http-ответ. тогда и заголовка вроде как не нужно.

// wbr

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

И слать готовый http-ответ ещё до того, как клиент http-запрос отправит. А ещё лучше самому коннектиться к клиентам и слать им http-ответы, которые они могут запросить =)

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

>> memcpy(buffer+sizeof(method), method, sizeof(method));

Ой...

>> можно пример?

Для начала лучше почитать что-нибудь по Си 8).

Deleted
()
Ответ на: комментарий от anonymous

да, кстати ... что такое sizeof, например ...

anonymous
()

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

sprintf принимает параметр const char *TEMPLATE, те принимает строка которую еще надо распарсить или парсить в процессе, а потом выполнить функцию strcpy/strncpy или memcpy.

и того получается что sprintf всего лишь обертка над полезной функией (в данном случае) strcpy/strncpy

denisko
()
Ответ на: комментарий от mint

> сайзоф вернет размер указателя, оторвать руки

а почему ты решил что это указатель а не идентификатор массива?

dilmah ★★★★★
()

Это ваша тема http://www.linux.org.ru/view-message.jsp?msgid=3241075 ? Вы что действительно DOS собрались устраиваить? Или зачем вам нужно как можно быстрее?

Используйте snprintf, ибо с вашим познанием Си: "memcpy(buffer, method, sizeof(method));" вы истратите гораздо больше времени на отладку вашей программы, чем выиграете от такой "оптимизации" кода.

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

>> а почему ты решил что это указатель а не идентификатор массива?

В данном случае однофигственно.

Deleted
()
Ответ на: комментарий от dilmah

>> ??

В смысле всё равно код работает неправильно.

Deleted
()

Если потом это дело куда то засылается в сокет, то, IMO, лучше вообще writev. И буфер строить не нужно и сис. вызов будет один.

undet
()

нужно еще собственную реализацию строк хранящую размер строки. чтобы не делать постоянно strlen. а вообще почитай lighttpd, там все понятно.

alex4
()
Ответ на: комментарий от Deleted

Кстати, за GCC-ем заметил такое: если строка лежит на стеке -- sizeof(strptr*) возвращает длину строки, а если строка в куче -- размер указателя на неё.

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

блин, ну не позорились бы. За GCC заметил. На стеке vs. в куче.

Что возвращать определяется по статическому типу.

Если идентификатор массива (или скажем, стринговый литерал), то возвращается размер массива.

Если указатель, то размер указателя.

Тип массива вовсе не совпадает с типом указателя. Просто в обычных случаях выполняется стандартное преобразование.

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

А может сделать например вот так:

char buffer[1024];
sockaddr_in ss;
ss.sin_family = AF_INET;
ss.sin_addr.s_addr =inet_addr(user_map);
ss.sin_port = htons(80);
int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s < 0) {
printf ("socket creation failure.\n");
exit;
}
int c = connect( s,(sockaddr *)&ss, sizeof(ss) );
if (c < 0) {
logex ("connection failure.\n");
exit;
}
strcpy(buffer,"GET http://");
strcat(buffer,user_map); //"192.168.0.1"
strcat(buffer,"/user-map");
strcat(buffer," HTTP/1.0\r\n\r\n");

if (send( s, buffer, strlen(buffer), MSG_NOSIGNAL )<0) {
close(s);
exit;
}

anonymous
()

>memcpy(buffer, "HTTP/1.0\r\n", sizeof("HTTP/1.0\r\n"));

ээээ. o_O

лично ТЕБЕ лучше использовать sprintf !!!

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

>>memcpy(buffer, "HTTP/1.0\r\n", sizeof("HTTP/1.0\r\n"));

>ээээ. o_O

>лично ТЕБЕ лучше использовать sprintf !!!

А что тебя в этой строчке так позмутило? :)

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

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

anonymous
()

snprintf/vsnprintf отработает намного быстрее, чем сама отправка данных по сети.

Есть простые правила для оптимизации:

1. Не делайте это

2. Никогда не делайте это

3. Если вы всё-таки решились, то см. п.1

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