Итак, я делаю код, чтобы сделать путь к файлу из имени.
sprintf(FilePath, "%s/%s", DirPath, FileName);
а также
strcpy(FilePath, DirPath);
strcat(FilePath, "/");
strcat(FilePath, FileName);
Какой из них быстрее/что я должен использовать? В обоих случаях у меня достаточно памяти.
В моих тестах метод strcpy
etc был примерно в 10 раз быстрее, с довольно коротким DirPath
. Точка безубыточности наступила, когда DirPath
содержит около 450 символов.
@toasted_flakes Я делаю malloc(strlen(DirPath) + strlen(FilePath) + 2);
strlen()
более одного раза для любой строкиstrcat()
нужно каждый раз повторно сканировать строку назначения, чтобы найти ее конец токприводит к квадратичному поведениюstatic char *construct_path(char*pathname,char*filename)
{
char *result;
size_t plen, flen;
plen = strlen(pathname);
flen = strlen(filename);
result= malloc(plen+flen+2);
if (!result)return NULL;
memcpy(result, pathname, plen);
result[plen]='/';
memcpy(result+plen+1, filename, flen);
result[plen+1+flen] = 0;
return result;
}
Обычно абонент уже может знать strlen()
, например, для постоянных путей.
Из моего комментария выше, для более длинного имени пути (450) это занимает половину времени.
sprintf(FilePath, "%s/%s", DirPath, FileName);
быстрее, потому что вторая версия должна дважды вычислять конец строки в вызовах функции strcat
.
sprintf
составляет строку, постоянно сохраняя последний символ строки, нет необходимости пересчитывать ее.
Проблема в том, что (по меньшей мере) семейство printf копирует дважды. (и, для здравомыслия, вы должны использовать snprintf()
, что еще дороже)
С POSIX вы можете написать
p = FilePath;
p = stpcpy(p, DirPath);
*p++ = '/';
p = stpcpy(p, Filename);
Это, скорее всего, не даст измеримого эффекта. Будьте осторожны, это небезопасно, и что если строка
FilePath
гарантированно будет длиннее, чемDirPath + Filepath + 2
, программа будет небезопасной. Вместо этого используйтеsnprintf
.