Advertisement
Guest User

Untitled

a guest
Jan 14th, 2016
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.85 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. #include <windows.h>
  4. using namespace std;
  5.  
  6. #define ArraySize 256*1024 // размер файла
  7. #define M 10 // сколько раз повторять для каждого размера блока
  8.  
  9. int main()
  10. {
  11. srand(time(NULL));
  12.  
  13. int i, j, k;
  14. byte *p;
  15. HANDLE data1, data2; // дескрипторы файлов
  16. __int64 c1, c2, fr; // переменные для тактов пр-ра, частоты
  17. DWORD c;
  18. float t, v; // время и скорость
  19.  
  20. BYTE A[ArraySize];
  21. for (int i = 0; i < ArraySize; i++)
  22. {
  23. A[i] = rand();
  24. };
  25.  
  26. data1 = CreateFile((LPCTSTR)"data1.dat", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  27. data2 = CreateFile((LPCTSTR)"data2.dat", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  28. // имя
  29. // открываем для чтения или записи
  30. // совместное использование файла запрещено
  31. // здесь либо дескриптор защиты либо нул
  32. // даже если существует такой файл - перезаписать его
  33. // обычный файл (не скрытый и не какой-нибудь еще)
  34. // то же здесь можно указывать флаг для некот. случаев
  35.  
  36. if (data1 == INVALID_HANDLE_VALUE || data2 == INVALID_HANDLE_VALUE) // если файлы не отркрылись, то выход
  37. {
  38. cout << "Oshibka" << GetLastError() << endl;
  39. cin.get();
  40. return 0;
  41. }
  42.  
  43. for (i = 0; i < ArraySize / 4; i++)
  44. WriteFile(data1, (LPVOID)rand(), 4, &c, 0);// Функция пишет данные в файл с места, обозначенного указателем позиции в файле.
  45. // дескриптор файла
  46. // буфер данных
  47. // число байтов для записи
  48. // число записанных байтов
  49. // асинхронный буфер
  50. if (WriteFile == 0)
  51. {
  52. cout << "Oshibka" << GetLastError() << endl;
  53. cin.get();
  54. return 0;
  55. }
  56.  
  57. cout << "size | mb/s" << endl;
  58.  
  59. for (i = 512; i <= 1024; i +=128) // Для всех размеров буфера обмена
  60. {
  61. t = 0.0;
  62. p = (byte *)GlobalAlloc(GPTR, i); // выделение памяти под буфер
  63. for (j = 0; j < M; j++)
  64. {
  65. SetFilePointer(data1, 0, NULL, FILE_BEGIN); // установка файлового указателя в начало файла
  66. SetFilePointer(data2, 0, NULL, FILE_BEGIN);
  67. for (k = 0; k < ArraySize / i; k++) // цикл столько раз, сколько блоков поместится в файле
  68. {
  69. QueryPerformanceCounter((LARGE_INTEGER *)&c1); // возвращает значение высокоточного системного таймера.
  70. ReadFile(data1, p, i, &c, 0); // чтение в буфер
  71. WriteFile(data2, p, i, &c, 0);
  72. QueryPerformanceCounter((LARGE_INTEGER *)&c2);
  73. QueryPerformanceFrequency((LARGE_INTEGER *)&fr); // показывает, сколько раз в секунду меняется значение таймера.
  74. t = t + (c2 - c1) / (float)fr; // время
  75. }
  76.  
  77. }
  78. t = t / M; // среднее время
  79. v = ArraySize / (1024 * 1024 * t); // скорость MB/s
  80. cout << i << "| " << v << endl;
  81. GlobalFree(p); // освобождение памяти, занятой буфером
  82. }
  83. DeleteFile((LPCTSTR)"data1.dat");
  84. DeleteFile((LPCTSTR)"data2.dat");
  85.  
  86. cin.get();
  87. return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement