2014-01-08 2 views
1

Следующая очень медленно для длинных строк:КДБ: создать список байт из станд :: строка

std::string s = "long string"; 
K klist = DBVec::CreateList(KG , s.length()); 
for (int i=0; i<s.length(); i++) 
{ 
    kG(klist)[i]=s.c_str()[i]; 
} 

Он работает Приемлемо быстро (< 100мс) для строк до 100k, но замедляется (десятки минут, возможно, часов) для строк в несколько миллионов символов. Я не вижу ничего, кроме kG, которые могут создавать нелинейность. Я не вижу причин, по которым функция accessor kG будет непостоянным, но в этом цикле ничего нет. К сожалению, я не знаю, как работает kG из-за отсутствия документации.

Вопрос: задан ли blob двоичных данных как std :: string, что является эффективным способом построения байтового списка?

ответ

0

Это работает:

memcpy(kG(klist), s.c_str(), s.length()); 

Тем не менее интересно, почему это цикл не O (N).

2

kG макрос определен в k.h, которая расширяется до ((x)->G0), т.е. следовать указателю G0 объекта K

http://kx.com/q/d/a/c.htm#Strings документы kp, который создает объект K строки непосредственно из строки, так что, вероятно вы могли бы сделать K klist = kp(s.c_str()) , который, вероятно, быстрее

Смежные вопросы