Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.104.238] |
|
Сообщ.
#1
,
|
|
|
Всем привет.
Вот пишу программу для копирования файлов. Написал код на Си и 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: #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; } |
Сообщ.
#2
,
|
|
|
Внезапно, лучше WinAPI.
Но не свой велосипед, а одна из функций: CopyFile() CopyFile2() CopyFileEx() CopyFileTransacted() |
Сообщ.
#3
,
|
|
|
Цитата cppasm @ Внезапно, лучше WinAPI. Спасибо за ответ. Хотелось бы всё же свой велосипед. Если юзать мой подход,можете что-то касаемо буфера посоветовать? |
Сообщ.
#4
,
|
|
|
Цитата Sherman @ Как мне показалось,при помощи API копирование произошло в 2 раза быстрее при одинаковых условиях. Действительно API быстрее Си кода(FILE *) ? Попробуй зарезервировать место для файла, в который пишешь. Сначала для hFile сделать GetFileSizeEx, потом для hFile2 - SetFilePointer/SetEndOfFile Цитата Sherman @ Хотелось бы всё же свой велосипед. Если юзать мой подход,можете что-то касаемо буфера посоветовать? Лучше использовать буфер 4096 |
Сообщ.
#5
,
|
|
|
Цитата Олег М @ Спасибо,попробую. Но 4096 это 24%ЦП только на один поток((( |
Сообщ.
#6
,
|
|
|
Цитата Sherman @ Но 4096 это 24%ЦП только на один поток((( Думаю, когда ты будешь читать/писать много файлов из разных потоков, нагрузка на процессор уменьшится. Диск-то один, ввод-вывод будет медленнее. |
Сообщ.
#7
,
|
|
|
Цитата Олег М @ Думаю, когда ты будешь читать/писать много файлов из разных потоков, нагрузка на процессор уменьшится. Диск-то один, ввод-вывод будет медленнее. Хорошо.На деле проверю. Вот осталось потоки научится узать. |