cout или printf, какой из двух имеет более высокую скорость выполнения C ++?

К сожалению, стандарт C ++ не определяет стандартный способ работы с файлами и папками таким образом.

Поскольку нет кросс-платформенного способа, лучшим кросс-платформенным способом является использование библиотеки, такой как модуль boost fileystem .

Метод повышения перекрестной платформы :

Следующая функция, заданная пути к каталогу и имени файла, рекурсивно ищет каталог и его подкаталоги для имени файла, возвращает bool, и в случае успеха путь к файл, который был найден.

blockquote>
bool find_file(const path & dir_path,         // in this directory,
               const std::string & file_name, // search for this name,
               path & path_found)             // placing path here if found
{
    if (!exists(dir_path)) 
        return false;

    directory_iterator end_itr; // default construction yields past-the-end

    for (directory_iterator itr(dir_path); itr != end_itr; ++itr)
    {
        if (is_directory(itr->status()))
        {
            if (find_file(itr->path(), file_name, path_found)) 
                return true;
        }
        else if (itr->leaf() == file_name) // see below
        {
            path_found = itr->path();
            return true;
        }
    }
    return false;
}

Источник с указанной выше страницы повышения.


Для систем на основе Unix / Linux:

Вы можете использовать opendir / readdir / closedir .

Пример кода, который выполняет поиск в каталоге для записи `` name '', это:

blockquote>
   len = strlen(name);
   dirp = opendir(".");
   while ((dp = readdir(dirp)) != NULL)
           if (dp->d_namlen == len && !strcmp(dp->d_name, name)) {
                   (void)closedir(dirp);
                   return FOUND;
           }
   (void)closedir(dirp);
   return NOT_FOUND;

Исходный код с приведенных выше справочных страниц.


Для систем на базе Windows:

вы можете использовать Win32 API FindFirstFile / FindNextFile / FindClose .

Следующий пример C ++ показывает минимальное использование FindFirstFile.

blockquote>
#include 
#include 
#include 

void _tmain(int argc, TCHAR *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind;

   if( argc != 2 )
   {
      _tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]);
      return;
   }

   _tprintf (TEXT("Target file is %s\n"), argv[1]);
   hFind = FindFirstFile(argv[1], &FindFileData);
   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("FindFirstFile failed (%d)\n", GetLastError());
      return;
   } 
   else 
   {
      _tprintf (TEXT("The first file found is %s\n"), 
                FindFileData.cFileName);
      FindClose(hFind);
   }
}

Исходный код из вышеуказанных страниц msdn.

24
задан Linger 4 September 2012 в 17:59
поделиться

12 ответов

У каждого есть свои накладные расходы. В зависимости от того, что вы печатаете, любой из них может быть быстрее.

Вот два момента, которые приходят на ум -

printf () должен анализировать строку «форматирования» и действовать в соответствии с ней, что увеличивает стоимость.
cout имеет более сложную иерархию наследования и передает объекты.

На практике разница не должна иметь значения для всех, кроме самых странных случаев. Если вы думаете, что это действительно важно - измерьте!

ИЗМЕНИТЬ -
О, черт возьми, я не верю, что делаю это, но для записи, в моем очень специфическом тестовом примере, с моей очень специфической машиной и ее очень специфической нагрузкой, компиляция в Release с использованием MSVC -

Печать 150,000 " Hello, World! "S (без использования endl) занимает около -
90 мс для printf (), 79 мс для cout.

Печать 150 000 случайных двойников занимает около -
3450 мс для printf (), 3420 мс для cout.

(в среднем за 10 прогонов).

Различия настолько незначительны, что, вероятно, ничего не значит ...

25
ответ дан 28 November 2019 в 22:22
поделиться

Производительность не является проблемой для сравнения; не могу придумать ничего там, где это действительно важно (разработка консольной программы). Однако есть несколько моментов, которые вы должны принять во внимание:

  • Iostreams используют цепочку операторов вместо va_args. Это означает, что ваша программа не может аварийно завершить работу из-за того, что вы передали неправильное количество аргументов. Это может произойти с printf.

  • Iostreams используют перегрузку операторов вместо va_args - это означает, что ваша программа не может аварийно завершить работу, потому что вы передали int, а она ожидала строку. Это может произойти с printf.

  • Iostreams не имеют встроенной поддержки форматных строк (что является основной основной причиной №1 и №2). В целом это хорошо, но иногда бывает полезно. Библиотека формата Boost предоставляет эту функциональность Iostreams для тех, кому она нужна с определенным поведением (генерирует исключение), а не с неопределенным поведением (как в случае с printf). В настоящее время это выходит за рамки стандарта.

  • Iostreams, в отличие от их эквивалентов printf, могут обрабатывать буферы переменной длины непосредственно сами, вместо того, чтобы вам приходилось иметь дело с жестко запрограммированным мусором.

Go for cout.

5
ответ дан 28 November 2019 в 22:22
поделиться

Другой вопрос о переполнении стека касался относительной скорости ввода-вывода в стиле C по сравнению с iostreams в C ++:

Обратите внимание, однако, что обсуждаемые тесты были для форматирования в буферы памяти. Я предполагаю, что если вы на самом деле выполняете ввод-вывод в консоль или файл, относительная разница в скорости будет намного меньше из-за того, что ввод-вывод занимает больше общего времени.

3
ответ дан 28 November 2019 в 22:22
поделиться

По крайней мере, в Windows запись в консоль является огромным узким местом, поэтому "шумная" программа в консольном режиме будет намного медленнее, чем тихая. Так что на этой платформе небольшие различия в библиотечных функциях, используемых для обращения к консоли, вероятно, не будут иметь существенного значения на практике.

На других платформах это может быть иначе. Кроме того, это зависит от того, какой объем вывода на консоль вы делаете по сравнению с другой полезной работой.

Наконец, это зависит от реализации вашей платформой библиотек ввода-вывода C и C ++.

Так что на этот вопрос нет общего ответа. вопрос.

7
ответ дан 28 November 2019 в 22:22
поделиться

Вам действительно нужно заботиться о том, что имеет более высокую скорость выполнения? Оба они используются просто для вывода текста на консоль / стандартный вывод, что обычно не является задачей, требующей сверхвысокой эффективности. Если на то пошло, я бы даже не подумал, что будет большая разница в скорости (хотя один может ожидать, что printf будет немного быстрее, потому что в нем отсутствуют незначительные сложности объектно-ориентированности ). Тем не менее, учитывая, что здесь мы имеем дело с операциями ввода-вывода, даже небольшая разница, вероятно, будет затоплена накладными расходами ввода-вывода. Конечно, если вы сравните эквивалентные методы записи в файлы, это будет так.

printf - это просто стандартный способ вывода текста на стандартный вывод в C.
Конвейер 'cout' - это просто стандартный способ вывода текста в стандартный вывод в C ++.

Говоря обо всем этом, есть ветка в группе comp.lang.cc , обсуждающая ту же проблему. Однако консенсус, похоже, заключается в том, что вам следует выбирать одно вместо другого по причинам, не связанным с производительностью.

24
ответ дан 28 November 2019 в 22:22
поделиться

Если вам когда-нибудь понадобится выяснить, по соображениям производительности, что-то еще в корне не так с вашим приложением - подумайте об использовании другого средства ведения журнала или пользовательского интерфейса;)

1
ответ дан 28 November 2019 в 22:22
поделиться

Чтобы решить это:

#include <iostream>
#include <cstdio>
#include <ctime>
using namespace std;

int main( int argc, char * argcv[] ) {
    const char * const s1 = "some text";
    const char * const s2 = "some more text";
    int x = 1, y = 2, z = 3;
    const int BIG = 2000;
    time_t now = time(0);
    for ( int i = 0; i < BIG; i++ ) {
        if ( argc == 1 ) {
            cout  << i << s1 << s2 << x << y << z << "\n";
        }
        else {
            printf( "%d%s%s%d%d%d\n", i, s1, s2, x, y, z );
        }
    }
    cout << (argc == 1 ? "cout " : "printf " ) << time(0) - now << endl;
}

производит идентичные тайминги для cout и printf.

1
ответ дан 28 November 2019 в 22:22
поделиться

На практике я всегда считал, что printf быстрее, чем cout. Но опять же, cout делает для вас гораздо больше с точки зрения безопасности типов. Также помните, что printf - это простая функция, тогда как cout - объект, основанный на сложной иерархии потоков, поэтому сравнивать время выполнения не совсем честно.

2
ответ дан 28 November 2019 в 22:22
поделиться

Если вы используете C ++, вы должны использовать вместо него cout , поскольку printf принадлежит к семейству функций C. В cout внесено множество улучшений, которые могут вам пригодиться. Что касается скорости, то это не проблема, поскольку ввод-вывод консоли в любом случае будет медленным.

2
ответ дан 28 November 2019 в 22:22
поделиться

Анекдотические свидетельства:
Однажды я разработал класс ведения журнала для использования операторов ostream - реализация была безумно медленной (для огромных объемов данных).

Я не очень много это анализировал, так что это могло быть вызвано неправильным использованием ostreams или просто объемом данных, записанных на диск. (Класс был исключен из-за проблем с производительностью, и на практике предпочтение было отдано стилю printf / fmtmsg.)

Я согласен с другими ответами, что в большинстве случаев это не имеет значения. Если вывод действительно является проблемой, вам следует подумать о способах избежать / отложить его, так как фактические обновления отображения обычно стоят больше, чем правильно реализованная строковая сборка. Тысячи строк, прокручиваемых за миллисекунды, в любом случае не очень информативны.

-2
ответ дан 28 November 2019 в 22:22
поделиться

Вы не должны никогда задавать этот вопрос, поскольку пользователь сможет читать только медленнее, чем они оба.

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

Как уже упоминалось другими, используйте какой-либо вид ведения журнала, если вам нужна запись операций.

-4
ответ дан 28 November 2019 в 22:22
поделиться

Under the hood, they will both use the same code, so speed differences will not matter.

If you are running on Windows only, the non-standard cprintf() might be faster as it bypasses a lot of the streams stuff.

However it is an odd requirement. Nobody can read that fast. Why not write output to a file, then the user can browse the file at their leisure?

0
ответ дан 28 November 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: