Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. // Benchmark comparing SdFile and StdioStream.
  2. #include <SPI.h>
  3. #include "SdFat.h"
  4. // Define PRINT_FIELD nonzero to use printField.
  5. #define PRINT_FIELD 0
  6. // Number of lines to list on Serial.
  7. #define STDIO_LIST_COUNT 0
  8. #define VERIFY_CONTENT 0
  9. const uint8_t SD_CS_PIN = SS;
  10. SdFat sd;
  11. SdFile printFile;
  12. StdioStream stdioFile;
  13. float f[100];
  14. char buf[20];
  15. const char* label[] =
  16. { "uint8_t 0 to 255, 100 times ", "uint16_t 0 to 20000",
  17. "uint32_t 0 to 20000", "uint32_t 1000000000 to 1000010000",
  18. "float nnn.ffff, 10000 times"
  19. };
  20. //------------------------------------------------------------------------------
  21. void setup() {
  22. uint32_t printSize;
  23. uint32_t stdioSize = 0;
  24. uint32_t printTime;
  25. uint32_t stdioTime = 0;
  26. Serial.begin(9600);
  27. while (!Serial) {
  28. SysCall::yield();
  29. }
  30. Serial.println(F("Type any character to start"));
  31. while (!Serial.available()) {
  32. SysCall::yield();
  33. }
  34. Serial.println(F("Starting test"));
  35. if (!sd.begin(SD_CS_PIN)) {
  36. sd.errorHalt();
  37. }
  38. for (uint8_t i = 0; i < 100; i++) {
  39. f[i] = 123.0 + 0.1234*i;
  40. }
  41. for (uint8_t dataType = 0; dataType < 5; dataType++) {
  42. for (uint8_t fileType = 0; fileType < 2; fileType++) {
  43. if (!fileType) {
  44. if (!printFile.open("print.txt", O_CREAT | O_RDWR | O_TRUNC)) {
  45. Serial.println(F("open fail"));
  46. return;
  47. }
  48. printTime = millis();
  49. switch (dataType) {
  50. case 0:
  51. for (uint16_t i =0; i < 100; i++) {
  52. for (uint8_t j = 0; j < 255; j++) {
  53. printFile.println(j);
  54. }
  55. }
  56. break;
  57. case 1:
  58. for (uint16_t i = 0; i < 20000; i++) {
  59. printFile.println(i);
  60. }
  61. break;
  62. case 2:
  63. for (uint32_t i = 0; i < 20000; i++) {
  64. printFile.println(i);
  65. }
  66. break;
  67. case 3:
  68. for (uint16_t i = 0; i < 10000; i++) {
  69. printFile.println(i + 1000000000UL);
  70. }
  71. break;
  72. case 4:
  73. for (int j = 0; j < 100; j++) {
  74. for (uint8_t i = 0; i < 100; i++) {
  75. printFile.println(f[i], 4);
  76. }
  77. }
  78. break;
  79. default:
  80. break;
  81. }
  82. printFile.sync();
  83. printTime = millis() - printTime;
  84. printFile.rewind();
  85. printSize = printFile.fileSize();
  86. } else {
  87. if (!stdioFile.fopen("stream.txt", "w+")) {
  88. Serial.println(F("fopen fail"));
  89. return;
  90. }
  91. stdioTime = millis();
  92. switch (dataType) {
  93. case 0:
  94. for (uint16_t i =0; i < 100; i++) {
  95. for (uint8_t j = 0; j < 255; j++) {
  96. #if PRINT_FIELD
  97. stdioFile.printField(j, '\n');
  98. #else // PRINT_FIELD
  99. stdioFile.println(j);
  100. #endif // PRINT_FIELD
  101. }
  102. }
  103. break;
  104. case 1:
  105. for (uint16_t i = 0; i < 20000; i++) {
  106. #if PRINT_FIELD
  107. stdioFile.printField(i, '\n');
  108. #else // PRINT_FIELD
  109. stdioFile.println(i);
  110. #endif // PRINT_FIELD
  111. }
  112. break;
  113. case 2:
  114. for (uint32_t i = 0; i < 20000; i++) {
  115. #if PRINT_FIELD
  116. stdioFile.printField(i, '\n');
  117. #else // PRINT_FIELD
  118. stdioFile.println(i);
  119. #endif // PRINT_FIELD
  120. }
  121. break;
  122. case 3:
  123. for (uint16_t i = 0; i < 10000; i++) {
  124. #if PRINT_FIELD
  125. stdioFile.printField(i + 1000000000UL, '\n');
  126. #else // PRINT_FIELD
  127. stdioFile.println(i + 1000000000UL);
  128. #endif // PRINT_FIELD
  129. }
  130. break;
  131. case 4:
  132. for (int j = 0; j < 100; j++) {
  133. for (uint8_t i = 0; i < 100; i++) {
  134. #if PRINT_FIELD
  135. stdioFile.printField(f[i], '\n', 4);
  136. #else // PRINT_FIELD
  137. stdioFile.println(f[i], 4);
  138. #endif // PRINT_FIELD
  139. }
  140. }
  141. break;
  142. default:
  143. break;
  144. }
  145. stdioFile.fflush();
  146. stdioTime = millis() - stdioTime;
  147. stdioSize = stdioFile.ftell();
  148. if (STDIO_LIST_COUNT) {
  149. size_t len;
  150. stdioFile.rewind();
  151. for (int i = 0; i < STDIO_LIST_COUNT; i++) {
  152. stdioFile.fgets(buf, sizeof(buf), &len);
  153. Serial.print(len);
  154. Serial.print(',');
  155. Serial.print(buf);
  156. }
  157. }
  158. }
  159. }
  160. Serial.println(label[dataType]);
  161. if (VERIFY_CONTENT && printSize == stdioSize) {
  162. printFile.rewind();
  163. stdioFile.rewind();
  164. for (uint32_t i = 0; i < stdioSize; i++) {
  165. if (printFile.read() != stdioFile.getc()) {
  166. Serial.print(F("Files differ at pos: "));
  167. Serial.println(i);
  168. return;
  169. }
  170. }
  171. }
  172. Serial.print(F("fileSize: "));
  173. if (printSize != stdioSize) {
  174. Serial.print(printSize);
  175. Serial.print(F(" != "));
  176. }
  177. Serial.println(stdioSize);
  178. Serial.print(F("print millis: "));
  179. Serial.println(printTime);
  180. Serial.print(F("stdio millis: "));
  181. Serial.println(stdioTime);
  182. Serial.print(F("ratio: "));
  183. Serial.println((float)printTime/(float)stdioTime);
  184. Serial.println();
  185. printFile.close();
  186. stdioFile.fclose();
  187. }
  188. Serial.println(F("Done"));
  189. }
  190. void loop() {}