c++ - Optimize this function? -
i have written code (uses v8 library). went through couple of times , feels it's way can write this. aim of function replace javascript .split()
function; when using function limit doesn't include last part of array in returning array. eg:
var str = "test split string limit"; var out = str.split(' ', 2);
the array out
contain: [test
, split
]. want contain: [test
, split
, string limit
].
i know there pure js ways find them hacky , possibly slower(?) single c++ bind call.
here's function:
/** * explodes string limits tokens * @param input * @param delim * @param limit * @return */ void asengine::engine::asstrtok(const v8::functioncallbackinfo<v8::value>& args) { assert(3, args); isolate* isolate = args.getisolate(); /* args */ string::utf8value a1(args[0]); string::utf8value a2(args[1]); local<uint32> a3 = args[2]->touint32(); std::string input = std::string(*a1); std::string delim = std::string(*a2); unsigned int limit = a3->int32value(); unsigned int inputlen = input.length(); // declare temporary array shove return later std::vector<char*> tmp; tmp.reserve(limit); unsigned int delimlen = delim.length(); char* cp = (char*) malloc(inputlen); char* cursor = cp + inputlen; // cursor char* cpp = (char*) cp; // keep start of string // copy haystack modifyable char ptr memset(cp + inputlen, 0x00, 1); memcpy(cp, input.c_str(), inputlen); unsigned int arrayindex = 0; for(unsigned int i=0;i<limit;i++) { if((cursor = strstr(cp, delim.c_str())) == null) { cursor = (char*) cpp + inputlen; break; } for(int j=0;j<delimlen;j++) *(cursor+j) = 0x00; tmp.push_back(cp); cp = cursor + delimlen; arrayindex++; } if(*(cp) != '\0') { arrayindex++; tmp.push_back(cp); } handle<array> rtn = array::new(args.getisolate(), arrayindex); /* loop through temporary array , assign variables v8 array */ for(unsigned int i=0;i<arrayindex;i++) { rtn->set(i, string::newfromutf8( isolate, tmp[i], string::knormalstring, strlen(tmp[i]) )); } /* clean memory */ delete cpp; cp = null; cpp = null; cursor = null; isolate = null; /* set return */ args.getreturnvalue().set(rtn); }
if wondering: variable cpp
there can delete character pointer after done (as calling v8's string::newfromutf8()
function copies string) , modify cp
pointer during process of function.
before optimising, fix code correct.
char* cp = (char*) malloc(inputlen); ... /* clean memory */ delete cpp;
whilst in implementations, new
, malloc
same thing, other implementations not. so, if allocate malloc
, use free
free memory, not delete
.
if want clever it, expect:
tmp.reserve(limit+1);
will ensure have space remainder of string without further allocation in vector.
since cursor
isn't used after loop, setting inside if
breaks loop makes no sense.
if((cursor = strstr(cp, delim.c_str())) == null) { cursor = (char*) cpp + inputlen; break; }
you using casts (char *)
in places don't need it, example:
char* cpp = (char*) cp; // keep start of string
(cp
char *
already).
this:
memset(cp + inputlen, 0x00, 1);
is same as:
cp[inputlen] = 0;
but unless compiler inlines memset
, faster.
likewsie:
*(cursor+j) = 0x00;
can written:
cursor[j] = 0;
however, assuming delimlen
greater 1, away with:
for(int j=0;j<delimlen;j++) *(cursor+j) = 0x00;
converted to:
*cursor = 0;
since new cp
value skip beyond delimlen
anyway.
these serve absolutely no purpose:
cp = null; cpp = null; cursor = null; isolate = null;
unfortunately, expect of time in function won't in of code i've commented on. in passing arguments , forth between calling js library , native c++ code. i'd surprised if gain on writing same code in js. (none of above make of difference when comes speed, it's correctness , "a small number of potentially wasted cycles if compiler rather daft").
Comments
Post a Comment