You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

203 lines
5.4KB

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