Если я делаю путь к файлу, какой из них быстрее?

Итак, я делаю код, чтобы сделать путь к файлу из имени.

sprintf(FilePath, "%s/%s", DirPath, FileName);

а также

strcpy(FilePath, DirPath);
strcat(FilePath, "/");
strcat(FilePath, FileName);

Какой из них быстрее/что я должен использовать? В обоих случаях у меня достаточно памяти.

Это, скорее всего, не даст измеримого эффекта. Будьте осторожны, это небезопасно, и что если строка FilePath гарантированно будет длиннее, чем DirPath + Filepath + 2, программа будет небезопасной. Вместо этого используйте snprintf.

toasted_flakes 07.04.2019 18:38

В моих тестах метод strcpy etc был примерно в 10 раз быстрее, с довольно коротким DirPath. Точка безубыточности наступила, когда DirPath содержит около 450 символов.

Weather Vane 07.04.2019 18:42

@toasted_flakes Я делаю malloc(strlen(DirPath) + strlen(FilePath) + 2);

user10778257 07.04.2019 18:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
75
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий
  • не вызывайте 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) это занимает половину времени.

Weather Vane 07.04.2019 19:28
sprintf(FilePath, "%s/%s", DirPath, FileName);

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

sprintf составляет строку, постоянно сохраняя последний символ строки, нет необходимости пересчитывать ее.

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

wildplasser 09.04.2019 00:11

С POSIX вы можете написать

p = FilePath;
p = stpcpy(p, DirPath);
*p++ = '/';
p = stpcpy(p, Filename);

Другие вопросы по теме