На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Чем копировать файл(Си vs WIN API).Размер буфера , Чем копировать файл(Си vs WIN API).Размер буфера
    Всем привет.
    Вот пишу программу для копирования файлов.
    Написал код на Си и WIN API.
    Тестировал на видео файле размером 6.7Гб
    Как мне показалось,при помощи API копирование произошло в 2 раза быстрее при одинаковых условиях.
    Действительно API быстрее Си кода(FILE *) ?
    Оба кода идентичны друг другу,без каких либо излишеств.
    Ещё вопрос касаемо размера буфера.
    Я обратил внимание на то,что при небольшом значении буфера,процессор грузится намного сильнее.
    COPY_BLOCK_SIZE = 4096 ~24% CPU
    COPY_BLOCK_SIZE = 2.5e+7 ~4% CPU
    При этом на скорости копирования разницы не заметил.
    Так вот,собственно,вопрос:
    Какой оптимальный размер буфера,учитывая,что копироваться будут параллельно несколько файлов(мультипоток) ?
    Загрузка ЦП в 24% на 1 поток - это очень много.
    Вот код с API:
    ExpandedWrap disabled
      #include <windows.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <windows.h>
      #include <sys/stat.h>
       
      #define COPY_BLOCK_SIZE 4096
       
      const TCHAR szCounterFileName[] = "C:\\11.mp4";
      const TCHAR szCounterFileName2[] = "E:\\11.mp4";
       
      int main()
      {
          DWORD tmp = { 0 };
          DWORD dwSize = { 0 };
          PBYTE buffer = 0;
       
          HANDLE hFile = CreateFile(szCounterFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
          if(INVALID_HANDLE_VALUE == hFile) {
              return 1;
          }
          HANDLE hFile2 = CreateFile(szCounterFileName2, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
          if(INVALID_HANDLE_VALUE == hFile2) {
              return 1;
          }
       
          dwSize = GetFileSize(hFile, NULL);
          printf("%ld", dwSize);
       
          if ((buffer = (BYTE *)malloc(COPY_BLOCK_SIZE * sizeof(BYTE)))==NULL)
          {
              return -1;
          }
       
          while ( ReadFile(hFile, (LPVOID)buffer, COPY_BLOCK_SIZE, &tmp, NULL ) && tmp > 0 ) {
              if ( ! WriteFile ( hFile2, (LPVOID)buffer, tmp, &tmp, NULL ))
                  exit(1);
          }
       
          free(buffer);
       
          CloseHandle(hFile);
          CloseHandle(hFile2);
       
          return 0;
      }
      Внезапно, лучше WinAPI.
      Но не свой велосипед, а одна из функций: CopyFile() CopyFile2() CopyFileEx() CopyFileTransacted()
        Цитата cppasm @
        Внезапно, лучше WinAPI.

        Спасибо за ответ.
        Хотелось бы всё же свой велосипед.
        Если юзать мой подход,можете что-то касаемо буфера посоветовать?
          Цитата Sherman @
          Как мне показалось,при помощи API копирование произошло в 2 раза быстрее при одинаковых условиях.
          Действительно API быстрее Си кода(FILE *) ?

          Попробуй зарезервировать место для файла, в который пишешь. Сначала для hFile сделать GetFileSizeEx, потом для hFile2 - SetFilePointer/SetEndOfFile


          Цитата Sherman @
          Хотелось бы всё же свой велосипед.
          Если юзать мой подход,можете что-то касаемо буфера посоветовать?

          Лучше использовать буфер 4096
            Цитата Олег М @

            Спасибо,попробую.
            Но 4096 это 24%ЦП только на один поток(((
              Цитата Sherman @
              Но 4096 это 24%ЦП только на один поток(((

              Думаю, когда ты будешь читать/писать много файлов из разных потоков, нагрузка на процессор уменьшится. Диск-то один, ввод-вывод будет медленнее.
                Цитата Олег М @
                Думаю, когда ты будешь читать/писать много файлов из разных потоков, нагрузка на процессор уменьшится. Диск-то один, ввод-вывод будет медленнее.

                Хорошо.На деле проверю.
                Вот осталось потоки научится узать.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0263 ]   [ 17 queries used ]   [ Generated: 19.03.24, 10:35 GMT ]