Russian Qt Forum
Сентябрь 30, 2024, 16:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QByteArray & append ( const char * str, int len ) медленный  (Прочитано 2961 раз)
Edynchik
Гость
« : Июнь 26, 2013, 16:38 »

Добрый вечер. Столкнулся с такой проблемой, QByteArray & append ( const char * str ) выполняется достаточно быстро, а QByteArray & append ( const char * str, int len ) не особенно. Наверное связано с тем чтог в первом случае создается только ссылка, а во втором глубокое копирование...не знаю. Есть альтернативы побыстрее? Спасибо.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Июнь 26, 2013, 16:45 »

Добрый вечер. Столкнулся с такой проблемой, QByteArray & append ( const char * str ) выполняется достаточно быстро, а QByteArray & append ( const char * str, int len ) не особенно. Наверное связано с тем чтог в первом случае создается только ссылка, а во втором глубокое копирование...не знаю. Есть альтернативы побыстрее? Спасибо.
Не вижу, где второй вариант может заметно тормозить, по сравнению с первым.

Код
C++ (Qt)
QByteArray& QByteArray::append(const char *str)
{
   if (str) {
       int len = qstrlen(str);
       if (d->ref != 1 || d->size + len > d->alloc)
           realloc(qAllocMore(d->size + len, sizeof(Data)));
       memcpy(d->data + d->size, str, len + 1); // include null terminator
       d->size += len;
   }
   return *this;
}
 
QByteArray &QByteArray::append(const char *str, int len)
{
   if (len < 0)
       len = qstrlen(str);
   if (str && len) {
       if (d->ref != 1 || d->size + len > d->alloc)
           realloc(qAllocMore(d->size + len, sizeof(Data)));
       memcpy(d->data + d->size, str, len); // include null terminator
       d->size += len;
       d->data[d->size] = '\0';
   }
   return *this;
}
 
Записан
Edynchik
Гость
« Ответ #2 : Июнь 26, 2013, 18:37 »


Не вижу, где второй вариант может заметно тормозить, по сравнению с первым.

ну как бы из личных наблюдений, в разы...в первом случае складывается порядка 100 пачек за секунду, а во втором 8...по времени очень похожа на QByteArray fromRawData ( const char * data, int size )
« Последнее редактирование: Июнь 26, 2013, 18:40 от Edynchik » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #3 : Июнь 27, 2013, 08:22 »

Судя по тому, что код методов отличается лишь d->data[d->size] = '\0', вряд ли эта строка приводит к такой разнице в производительности в десятки раз. Причина в чем-то другом.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.069 секунд. Запросов: 22.