// Benchmark comparing SdFile and StdioStream. #include #include "SdFat.h" #include "sdios.h" // Define PRINT_FIELD nonzero to use printField. #define PRINT_FIELD 0 // Number of lines to list on Serial. #define STDIO_LIST_COUNT 0 #define VERIFY_CONTENT 0 const uint8_t SD_CS_PIN = SS; SdFat sd; SdFile printFile; StdioStream stdioFile; float f[100]; char buf[20]; const char* label[] = { "uint8_t 0 to 255, 100 times ", "uint16_t 0 to 20000", "uint32_t 0 to 20000", "uint32_t 1000000000 to 1000010000", "float nnn.ffff, 10000 times" }; //------------------------------------------------------------------------------ void setup() { uint32_t printSize = 0; uint32_t stdioSize = 0; uint32_t printTime = 0; uint32_t stdioTime = 0; Serial.begin(9600); while (!Serial) { SysCall::yield(); } Serial.println(F("Type any character to start")); while (!Serial.available()) { SysCall::yield(); } Serial.println(F("Starting test")); // Initialize at the highest speed supported by the board that is // not over 50 MHz. Try a lower speed if SPI errors occur. if (!sd.begin(SD_CS_PIN, SD_SCK_MHZ(50))) { sd.errorHalt(); } for (uint8_t i = 0; i < 100; i++) { f[i] = 123.0 + 0.1234*i; } for (uint8_t dataType = 0; dataType < 5; dataType++) { for (uint8_t fileType = 0; fileType < 2; fileType++) { if (!fileType) { if (!printFile.open("print.txt", O_RDWR | O_CREAT | O_TRUNC)) { Serial.println(F("open fail")); return; } printTime = millis(); switch (dataType) { case 0: for (uint16_t i =0; i < 100; i++) { for (uint8_t j = 0; j < 255; j++) { printFile.println(j); } } break; case 1: for (uint16_t i = 0; i < 20000; i++) { printFile.println(i); } break; case 2: for (uint32_t i = 0; i < 20000; i++) { printFile.println(i); } break; case 3: for (uint16_t i = 0; i < 10000; i++) { printFile.println(i + 1000000000UL); } break; case 4: for (int j = 0; j < 100; j++) { for (uint8_t i = 0; i < 100; i++) { printFile.println(f[i], 4); } } break; default: break; } printFile.sync(); printTime = millis() - printTime; printFile.rewind(); printSize = printFile.fileSize(); } else { if (!stdioFile.fopen("stream.txt", "w+")) { Serial.println(F("fopen fail")); return; } stdioTime = millis(); switch (dataType) { case 0: for (uint16_t i =0; i < 100; i++) { for (uint8_t j = 0; j < 255; j++) { #if PRINT_FIELD stdioFile.printField(j, '\n'); #else // PRINT_FIELD stdioFile.println(j); #endif // PRINT_FIELD } } break; case 1: for (uint16_t i = 0; i < 20000; i++) { #if PRINT_FIELD stdioFile.printField(i, '\n'); #else // PRINT_FIELD stdioFile.println(i); #endif // PRINT_FIELD } break; case 2: for (uint32_t i = 0; i < 20000; i++) { #if PRINT_FIELD stdioFile.printField(i, '\n'); #else // PRINT_FIELD stdioFile.println(i); #endif // PRINT_FIELD } break; case 3: for (uint16_t i = 0; i < 10000; i++) { uint32_t n = i + 1000000000UL; #if PRINT_FIELD stdioFile.printField(n, '\n'); #else // PRINT_FIELD stdioFile.println(n); #endif // PRINT_FIELD } break; case 4: for (int j = 0; j < 100; j++) { for (uint8_t i = 0; i < 100; i++) { #if PRINT_FIELD stdioFile.printField(f[i], '\n', 4); #else // PRINT_FIELD stdioFile.println(f[i], 4); #endif // PRINT_FIELD } } break; default: break; } stdioFile.fflush(); stdioTime = millis() - stdioTime; stdioSize = stdioFile.ftell(); if (STDIO_LIST_COUNT) { size_t len; stdioFile.rewind(); for (int i = 0; i < STDIO_LIST_COUNT; i++) { stdioFile.fgets(buf, sizeof(buf), &len); Serial.print(len); Serial.print(','); Serial.print(buf); } } } } Serial.println(label[dataType]); if (VERIFY_CONTENT && printSize == stdioSize) { printFile.rewind(); stdioFile.rewind(); for (uint32_t i = 0; i < stdioSize; i++) { if (printFile.read() != stdioFile.getc()) { Serial.print(F("Files differ at pos: ")); Serial.println(i); return; } } } Serial.print(F("fileSize: ")); if (printSize != stdioSize) { Serial.print(printSize); Serial.print(F(" != ")); } Serial.println(stdioSize); Serial.print(F("print millis: ")); Serial.println(printTime); Serial.print(F("stdio millis: ")); Serial.println(stdioTime); Serial.print(F("ratio: ")); Serial.println((float)printTime/(float)stdioTime); Serial.println(); printFile.close(); stdioFile.fclose(); } Serial.println(F("Done")); } void loop() {}