Which SD is Best for Audio Projects?

Bill Greiman

Well-known member
Warning: I have edited this post to add a latency measurement.

Paul is looking for better SD performance for multi-file audio projects.

I wrote a quick random I/O test for evaluating SD cards on Teensy 4.1.

I posted results for a CANVAS Go! Plus 256GB below. Run the test on your fastest card and post your result.

Here is the test:
Code:
// SD Random I/O tests.
#include "SdFat.h"
const size_t MAX_FILES = 16;
const size_t MAX_SECTORS = 64;
// Space files by 1 GiB
const uint32_t FILE_ALLOC = 1UL << 30;
// File size 1 MiB
const uint32_t FILE_SIZE = 1UL << 20;

SdFs sd;
FsFile file[MAX_FILES];
uint8_t buf[512*MAX_SECTORS];

// Try to select the best SD card configuration.
#if HAS_SDIO_CLASS
#define SD_CONFIG SdioConfig(FIFO_SDIO)
#else  // HAS_SDIO_CLASS
#define SD_CONFIG SdSpiConfig(SS,DEDICATED_SPI, SD_SCK_MHZ(50))
#endif  // HAS_SDIO_CLASS
#define error(msg) {Serial.println(msg);while (true);}

char name[] = "?.bin";

void closeFiles() {
  for (uint8_t i = 0; i < MAX_FILES; i++) {
    file[i].close();
  }
}  

void createFiles() {
  uint32_t m;
  Serial.println("Create files");
  m = micros();
  for (uint8_t i = 0; i < MAX_FILES; i++) {
    // Spread files so files ping-pong.
    name[0] = 'A' + ( i < MAX_FILES/2 ? i*2 : 2*i - MAX_FILES + 1 );
    if (!file[i].open(name, O_RDWR | O_CREAT | O_TRUNC)) error("open create");
    if (!file[i].preAllocate(FILE_ALLOC)) error("preAllocate");
  }
  m = micros() - m;
  Serial.print("Create micros: ");
  Serial.println(m);
  memset(buf, 0XAA, sizeof(buf));
  uint32_t nw = FILE_SIZE/sizeof(buf);  
  m = micros();
  for (uint8_t i = 0; i < MAX_FILES; i++) {
    for (uint32_t iw = 0; iw < nw; iw++) {
      if (sizeof(buf) != file[i].write(buf, sizeof(buf))) error("create write");
    }
  }
  m = micros() - m;
  Serial.print("Sequential Write: ");
  Serial.print(MAX_FILES*FILE_SIZE/(0.001*m));
  Serial.println(" KB/sec"); 
  closeFiles();
}
void openFiles(uint8_t opt) {
  for (uint8_t i = 0; i < MAX_FILES; i++) {
    name[0] = i + 'A';
    if (!file[i].open(name, opt)) error("open");
  }  
}
void randomRead() {
  Serial.print("Begin Random Read Test\nns - read size sectors,");
  Serial.println(" nf - number of files, maxLat - latency micros");
  uint32_t m;
  uint32_t maxLat;
  uint32_t lat;
  for (uint8_t ns = MAX_SECTORS; ns > 0; ns /= 2) {
    for (uint8_t nf = 1; nf <= MAX_FILES; nf *= 2) {
      openFiles(O_RDONLY);
      maxLat = 0;      
      uint32_t nr = FILE_SIZE/(512*ns);
      m = micros();
      for (uint32_t ir = 0; ir < nr; ir++) {
        for (uint32_t i = 0; i < nf; i++) {
          lat = micros();
          if (ns*512 != file[i].read(buf, ns*512)) error("randomRead");
          lat = micros() - lat;
          if (lat > maxLat) {
            maxLat = lat;
          }
        }
      }
      m = micros() - m;
      Serial.print("ns: ");
      Serial.print(ns);     
      Serial.print(" nf: ");
      Serial.print(nf);
      Serial.print(" maxLat: ");
      Serial.print(maxLat);
      Serial.print(" total KB/sec: ");
      Serial.print(nf*FILE_SIZE/(0.001*m));
      Serial.print(" file KB/sec: ");
      Serial.println(FILE_SIZE/(0.001*m));
      closeFiles();      
    }
  }
  Serial.println("End Random Read Test");
}

void randomWrite() {
  Serial.print("Begin Random Write Test\nns - read size sectors,");
  Serial.println(" nf - number of files, maxLat - latency micros");
  uint32_t m;
  uint32_t maxLat;
  uint32_t lat;
  for (uint8_t ns = MAX_SECTORS; ns > 0; ns /= 2) {
    for (uint8_t nf = 1; nf <= MAX_FILES; nf *= 2) {
      openFiles(O_RDWR);
      maxLat = 0;          
      uint32_t nr = FILE_SIZE/(512*ns);
      m = micros();
      for (uint32_t ir = 0; ir < nr; ir++) {
        for (uint32_t i = 0; i < nf; i++) {
          lat = micros();          
          if (ns*512 != file[i].write(buf, ns*512)) error("randomWrite");
          lat = micros() - lat;          
          if (lat > maxLat) {
            maxLat = lat;
          }          
        }
      }
      m = micros() - m;
      Serial.print("ns: ");
      Serial.print(ns);     
      Serial.print(" nf: ");
      Serial.print(nf);
      Serial.print(" maxLat: ");
      Serial.print(maxLat);      
      Serial.print(" total KB/sec: ");
      Serial.print(nf*FILE_SIZE/(0.001*m));
      Serial.print(" file KB/sec: ");
      Serial.println(FILE_SIZE/(0.001*m));
      closeFiles();      
    }
  }
  Serial.println("End Random Write Test");
}

void removeFiles() {
  uint32_t m = micros();
  for (uint8_t i = 0; i < MAX_FILES; i++) {
    name[0] = i + 'A';
    if (!sd.remove(name)) error("removeFiles");;
  }
  m = micros() - m;
  Serial.print("Remove micros: ");
  Serial.println(m);
}

void setup() {
  Serial.begin(9600);
  while (!Serial) {}
  Serial.println("Type any character to start");
  while (!Serial.available()) {}
  do {
    delay(10);
  } while (Serial.read() >= 0);
  if (!sd.begin(SD_CONFIG)) error("sd.begin()");
  createFiles();
  randomRead();
  randomWrite();
  Serial.println("Type any character to remove files");
  while (!Serial.available()) {}
  removeFiles();
  Serial.println("Done");
}

void loop() {
}

Here is the output:
Card: CANVAS Go! Plus 256GB

Type any character to start
Create files
Create micros: 65069
Sequential Write: 21765.24 KB/sec
Begin Random Read Test
ns - read size sectors, nf - number of files, maxLat - latency micros
ns: 64 nf: 1 maxLat: 1943 total KB/sec: 22768.90 file KB/sec: 22768.90
ns: 64 nf: 2 maxLat: 2033 total KB/sec: 18104.34 file KB/sec: 9052.17
ns: 64 nf: 4 maxLat: 2039 total KB/sec: 18095.12 file KB/sec: 4523.78
ns: 64 nf: 8 maxLat: 2032 total KB/sec: 17980.31 file KB/sec: 2247.54
ns: 64 nf: 16 maxLat: 2022 total KB/sec: 17458.01 file KB/sec: 1091.13
ns: 32 nf: 1 maxLat: 1231 total KB/sec: 22762.97 file KB/sec: 22762.97
ns: 32 nf: 2 maxLat: 1291 total KB/sec: 14847.93 file KB/sec: 7423.97
ns: 32 nf: 4 maxLat: 1292 total KB/sec: 14869.73 file KB/sec: 3717.43
ns: 32 nf: 8 maxLat: 1374 total KB/sec: 14740.39 file KB/sec: 1842.55
ns: 32 nf: 16 maxLat: 1377 total KB/sec: 13967.08 file KB/sec: 872.94
ns: 16 nf: 1 maxLat: 874 total KB/sec: 22750.62 file KB/sec: 22750.62
ns: 16 nf: 2 maxLat: 923 total KB/sec: 11198.37 file KB/sec: 5599.18
ns: 16 nf: 4 maxLat: 926 total KB/sec: 11193.62 file KB/sec: 2798.40
ns: 16 nf: 8 maxLat: 939 total KB/sec: 11128.46 file KB/sec: 1391.06
ns: 16 nf: 16 maxLat: 990 total KB/sec: 10198.61 file KB/sec: 637.41
ns: 8 nf: 1 maxLat: 470 total KB/sec: 22724.49 file KB/sec: 22724.49
ns: 8 nf: 2 maxLat: 475 total KB/sec: 12066.05 file KB/sec: 6033.03
ns: 8 nf: 4 maxLat: 478 total KB/sec: 12056.34 file KB/sec: 3014.08
ns: 8 nf: 8 maxLat: 551 total KB/sec: 12039.59 file KB/sec: 1504.95
ns: 8 nf: 16 maxLat: 552 total KB/sec: 9964.97 file KB/sec: 622.81
ns: 4 nf: 1 maxLat: 384 total KB/sec: 22669.46 file KB/sec: 22669.46
ns: 4 nf: 2 maxLat: 483 total KB/sec: 7108.65 file KB/sec: 3554.33
ns: 4 nf: 4 maxLat: 482 total KB/sec: 7115.09 file KB/sec: 1778.77
ns: 4 nf: 8 maxLat: 542 total KB/sec: 7040.71 file KB/sec: 880.09
ns: 4 nf: 16 maxLat: 607 total KB/sec: 5722.95 file KB/sec: 357.68
ns: 2 nf: 1 maxLat: 339 total KB/sec: 22565.55 file KB/sec: 22565.55
ns: 2 nf: 2 maxLat: 420 total KB/sec: 3898.04 file KB/sec: 1949.02
ns: 2 nf: 4 maxLat: 421 total KB/sec: 3899.74 file KB/sec: 974.94
ns: 2 nf: 8 maxLat: 611 total KB/sec: 3844.60 file KB/sec: 480.57
ns: 2 nf: 16 maxLat: 612 total KB/sec: 3056.48 file KB/sec: 191.03
ns: 1 nf: 1 maxLat: 317 total KB/sec: 22456.33 file KB/sec: 22456.33
ns: 1 nf: 2 maxLat: 421 total KB/sec: 1949.45 file KB/sec: 974.72
ns: 1 nf: 4 maxLat: 421 total KB/sec: 1950.89 file KB/sec: 487.72
ns: 1 nf: 8 maxLat: 615 total KB/sec: 1920.14 file KB/sec: 240.02
ns: 1 nf: 16 maxLat: 615 total KB/sec: 1525.40 file KB/sec: 95.34
End Random Read Test
Begin Random Write Test
ns - read size sectors, nf - number of files, maxLat - latency micros
ns: 64 nf: 1 maxLat: 1514 total KB/sec: 22618.12 file KB/sec: 22618.12
ns: 64 nf: 2 maxLat: 8142 total KB/sec: 13250.64 file KB/sec: 6625.32
ns: 64 nf: 4 maxLat: 22946 total KB/sec: 12404.63 file KB/sec: 3101.16
ns: 64 nf: 8 maxLat: 16905 total KB/sec: 12900.79 file KB/sec: 1612.60
ns: 64 nf: 16 maxLat: 18455 total KB/sec: 12695.76 file KB/sec: 793.48
ns: 32 nf: 1 maxLat: 790 total KB/sec: 22616.66 file KB/sec: 22616.66
ns: 32 nf: 2 maxLat: 7355 total KB/sec: 11111.86 file KB/sec: 5555.93
ns: 32 nf: 4 maxLat: 21153 total KB/sec: 11131.68 file KB/sec: 2782.92
ns: 32 nf: 8 maxLat: 16387 total KB/sec: 11203.65 file KB/sec: 1400.46
ns: 32 nf: 16 maxLat: 18029 total KB/sec: 11175.53 file KB/sec: 698.47
ns: 16 nf: 1 maxLat: 429 total KB/sec: 22610.32 file KB/sec: 22610.32
ns: 16 nf: 2 maxLat: 7679 total KB/sec: 6811.99 file KB/sec: 3405.99
ns: 16 nf: 4 maxLat: 28843 total KB/sec: 6650.26 file KB/sec: 1662.56
ns: 16 nf: 8 maxLat: 16897 total KB/sec: 7041.59 file KB/sec: 880.20
ns: 16 nf: 16 maxLat: 18537 total KB/sec: 7019.15 file KB/sec: 438.70
ns: 8 nf: 1 maxLat: 6410 total KB/sec: 19950.08 file KB/sec: 19950.08
ns: 8 nf: 2 maxLat: 7246 total KB/sec: 5005.49 file KB/sec: 2502.75
ns: 8 nf: 4 maxLat: 22441 total KB/sec: 4942.50 file KB/sec: 1235.62
ns: 8 nf: 8 maxLat: 17998 total KB/sec: 5002.65 file KB/sec: 625.33
ns: 8 nf: 16 maxLat: 19384 total KB/sec: 4969.51 file KB/sec: 310.59
ns: 4 nf: 1 maxLat: 157 total KB/sec: 22575.27 file KB/sec: 22575.27
ns: 4 nf: 2 maxLat: 23712 total KB/sec: 2425.31 file KB/sec: 1212.65
ns: 4 nf: 4 maxLat: 17437 total KB/sec: 2502.12 file KB/sec: 625.53
ns: 4 nf: 8 maxLat: 18506 total KB/sec: 2500.34 file KB/sec: 312.54
ns: 4 nf: 16 maxLat: 26724 total KB/sec: 2325.89 file KB/sec: 145.37
ns: 2 nf: 1 maxLat: 115 total KB/sec: 22556.81 file KB/sec: 22556.81
ns: 2 nf: 2 maxLat: 18399 total KB/sec: 1345.67 file KB/sec: 672.84
ns: 2 nf: 4 maxLat: 17360 total KB/sec: 1248.65 file KB/sec: 312.16
ns: 2 nf: 8 maxLat: 22839 total KB/sec: 1241.68 file KB/sec: 155.21
ns: 2 nf: 16 maxLat: 21187 total KB/sec: 1198.67 file KB/sec: 74.92
ns: 1 nf: 1 maxLat: 100 total KB/sec: 22578.67 file KB/sec: 22578.67
ns: 1 nf: 2 maxLat: 21463 total KB/sec: 717.65 file KB/sec: 358.83
ns: 1 nf: 4 maxLat: 16101 total KB/sec: 624.03 file KB/sec: 156.01
ns: 1 nf: 8 maxLat: 23741 total KB/sec: 616.63 file KB/sec: 77.08
ns: 1 nf: 16 maxLat: 25202 total KB/sec: 609.65 file KB/sec: 38.10
End Random Write Test
Type any character to remove files
Remove micros: 52473
Done
 
Last edited:
Kingston CANVAS Go! Plus 64GB

Thank you Bill!

Here the results for a Kingston CANVAS Go! Plus 64GB


Type any character to start
Create files
Create micros: 83092
Sequential Write: 21659.65 KB/sec
Begin Random Read Test
ns - read size sectors, nf - number of files, maxLat - latency micros
ns: 64 nf: 1 maxLat: 1929 total KB/sec: 22832.36 file KB/sec: 22832.36
ns: 64 nf: 2 maxLat: 1939 total KB/sec: 18325.02 file KB/sec: 9162.51
ns: 64 nf: 4 maxLat: 1940 total KB/sec: 18314.54 file KB/sec: 4578.63
ns: 64 nf: 8 maxLat: 2018 total KB/sec: 18162.03 file KB/sec: 2270.25
ns: 64 nf: 16 maxLat: 2021 total KB/sec: 17628.81 file KB/sec: 1101.80
ns: 32 nf: 1 maxLat: 1220 total KB/sec: 22827.39 file KB/sec: 22827.39
ns: 32 nf: 2 maxLat: 1341 total KB/sec: 14784.40 file KB/sec: 7392.20
ns: 32 nf: 4 maxLat: 1340 total KB/sec: 14871.36 file KB/sec: 3717.84
ns: 32 nf: 8 maxLat: 1470 total KB/sec: 14738.39 file KB/sec: 1842.30
ns: 32 nf: 16 maxLat: 1466 total KB/sec: 13956.93 file KB/sec: 872.31
ns: 16 nf: 1 maxLat: 868 total KB/sec: 22817.45 file KB/sec: 22817.45
ns: 16 nf: 2 maxLat: 914 total KB/sec: 11290.06 file KB/sec: 5645.03
ns: 16 nf: 4 maxLat: 918 total KB/sec: 11287.54 file KB/sec: 2821.89
ns: 16 nf: 8 maxLat: 1224 total KB/sec: 11182.89 file KB/sec: 1397.86
ns: 16 nf: 16 maxLat: 1218 total KB/sec: 10246.34 file KB/sec: 640.40
ns: 8 nf: 1 maxLat: 469 total KB/sec: 22797.11 file KB/sec: 22797.11
ns: 8 nf: 2 maxLat: 469 total KB/sec: 12062.72 file KB/sec: 6031.36
ns: 8 nf: 4 maxLat: 468 total KB/sec: 12076.65 file KB/sec: 3019.16
ns: 8 nf: 8 maxLat: 545 total KB/sec: 12057.34 file KB/sec: 1507.17
ns: 8 nf: 16 maxLat: 544 total KB/sec: 10005.50 file KB/sec: 625.34
ns: 4 nf: 1 maxLat: 380 total KB/sec: 22760.49 file KB/sec: 22760.49
ns: 4 nf: 2 maxLat: 481 total KB/sec: 7143.28 file KB/sec: 3571.64
ns: 4 nf: 4 maxLat: 481 total KB/sec: 7153.22 file KB/sec: 1788.30
ns: 4 nf: 8 maxLat: 743 total KB/sec: 7046.92 file KB/sec: 880.86
ns: 4 nf: 16 maxLat: 676 total KB/sec: 5720.58 file KB/sec: 357.54
ns: 2 nf: 1 maxLat: 335 total KB/sec: 22686.63 file KB/sec: 22686.63
ns: 2 nf: 2 maxLat: 416 total KB/sec: 3929.11 file KB/sec: 1964.56
ns: 2 nf: 4 maxLat: 416 total KB/sec: 3933.56 file KB/sec: 983.39
ns: 2 nf: 8 maxLat: 668 total KB/sec: 3894.67 file KB/sec: 486.83
ns: 2 nf: 16 maxLat: 669 total KB/sec: 3090.51 file KB/sec: 193.16
ns: 1 nf: 1 maxLat: 312 total KB/sec: 22585.96 file KB/sec: 22585.96
ns: 1 nf: 2 maxLat: 417 total KB/sec: 1975.12 file KB/sec: 987.56
ns: 1 nf: 4 maxLat: 418 total KB/sec: 1977.88 file KB/sec: 494.47
ns: 1 nf: 8 maxLat: 669 total KB/sec: 1956.14 file KB/sec: 244.52
ns: 1 nf: 16 maxLat: 669 total KB/sec: 1548.56 file KB/sec: 96.79
End Random Read Test
Begin Random Write Test
ns - read size sectors, nf - number of files, maxLat - latency micros
ns: 64 nf: 1 maxLat: 1515 total KB/sec: 22570.89 file KB/sec: 22570.89
ns: 64 nf: 2 maxLat: 6228 total KB/sec: 12076.68 file KB/sec: 6038.34
ns: 64 nf: 4 maxLat: 21298 total KB/sec: 11677.93 file KB/sec: 2919.48
ns: 64 nf: 8 maxLat: 15065 total KB/sec: 11970.87 file KB/sec: 1496.36
ns: 64 nf: 16 maxLat: 42463 total KB/sec: 11596.09 file KB/sec: 724.76
ns: 32 nf: 1 maxLat: 792 total KB/sec: 22571.38 file KB/sec: 22571.38
ns: 32 nf: 2 maxLat: 5457 total KB/sec: 10633.84 file KB/sec: 5316.92
ns: 32 nf: 4 maxLat: 19102 total KB/sec: 10369.54 file KB/sec: 2592.39
ns: 32 nf: 8 maxLat: 14163 total KB/sec: 10608.10 file KB/sec: 1326.01
ns: 32 nf: 16 maxLat: 15846 total KB/sec: 10525.70 file KB/sec: 657.86
ns: 16 nf: 1 maxLat: 430 total KB/sec: 22573.32 file KB/sec: 22573.32
ns: 16 nf: 2 maxLat: 6563 total KB/sec: 6800.74 file KB/sec: 3400.37
ns: 16 nf: 4 maxLat: 19988 total KB/sec: 6774.00 file KB/sec: 1693.50
ns: 16 nf: 8 maxLat: 20993 total KB/sec: 6717.89 file KB/sec: 839.74
ns: 16 nf: 16 maxLat: 21319 total KB/sec: 6821.15 file KB/sec: 426.32
ns: 8 nf: 1 maxLat: 334 total KB/sec: 22536.45 file KB/sec: 22536.45
ns: 8 nf: 2 maxLat: 6367 total KB/sec: 4859.18 file KB/sec: 2429.59
ns: 8 nf: 4 maxLat: 20380 total KB/sec: 4831.35 file KB/sec: 1207.84
ns: 8 nf: 8 maxLat: 16118 total KB/sec: 4867.92 file KB/sec: 608.49
ns: 8 nf: 16 maxLat: 23505 total KB/sec: 4806.86 file KB/sec: 300.43
ns: 4 nf: 1 maxLat: 242 total KB/sec: 22546.14 file KB/sec: 22546.14
ns: 4 nf: 2 maxLat: 21079 total KB/sec: 2316.45 file KB/sec: 1158.23
ns: 4 nf: 4 maxLat: 15486 total KB/sec: 2399.00 file KB/sec: 599.75
ns: 4 nf: 8 maxLat: 16085 total KB/sec: 2390.52 file KB/sec: 298.81
ns: 4 nf: 16 maxLat: 23348 total KB/sec: 2261.18 file KB/sec: 141.32
ns: 2 nf: 1 maxLat: 199 total KB/sec: 22562.15 file KB/sec: 22562.15
ns: 2 nf: 2 maxLat: 16202 total KB/sec: 1331.63 file KB/sec: 665.82
ns: 2 nf: 4 maxLat: 15705 total KB/sec: 1216.75 file KB/sec: 304.19
ns: 2 nf: 8 maxLat: 20856 total KB/sec: 1193.93 file KB/sec: 149.24
ns: 2 nf: 16 maxLat: 20854 total KB/sec: 1169.70 file KB/sec: 73.11
ns: 1 nf: 1 maxLat: 186 total KB/sec: 22550.02 file KB/sec: 22550.02
ns: 1 nf: 2 maxLat: 19258 total KB/sec: 715.57 file KB/sec: 357.79
ns: 1 nf: 4 maxLat: 25980 total KB/sec: 601.84 file KB/sec: 150.46
ns: 1 nf: 8 maxLat: 20941 total KB/sec: 602.79 file KB/sec: 75.35
ns: 1 nf: 16 maxLat: 21906 total KB/sec: 594.84 file KB/sec: 37.18
End Random Write Test
Type any character to remove files
Remove micros: 69665
Done
 
Last edited:
I have edited the original post to add a latency test. The CANVAS Go! Plus may appear to have long write latency but other cards I tested have ten times greater when pushed.

At least you can schedule around write latency to some extent by checking for SD busy and using several single sector writes in succession to a given file.
 
Thanks Bill. That's a really useful benchmark! Ran it here on a couple cards. Will do more tonight.

I'm seeing 2 main take-away points from the results.

1: Look like 8 sector reads is a sweet spot where we get a lot more performance for only a small latency increase, or 4 sectors looks like the best choice if we want minimum latency.

2: No matter what we do, we're looking at 415 to 550 microseconds latency. For audio, our max timing budget is 2902 microseconds, so 500 is good in that it uses only about 1/6th of the available time, but on the other hand not so wonderful that we spend a good size chunk of the time we could have been number crunching DSP just blocking waiting for a read to fill buffers (which we won't even use until the next 2902 time slot). When users put many instances of numerically heavy effects like ladder filters, reverb, bandwidth limited oscillators into their project, all that DSP work uses some of the 2902 budget. An API where we could spend minimum time starting 1 read operation during those 2902 microseconds and then harvest the data from a buffer during the next 2902 microsecond time would be so much better that wasting ~500 of the 2902 microseconds just setting in a loop waiting for data we don't even need until the next period.
 
Nope; would be better to use a RTOS as it can do such things on so much more occasions. The lib then could just jump to the next task.
 
API where we could spend minimum time starting 1 read

The problem is that DMA does not work well with the NXP controller so everything is polled. Here is the core for reading a sector:
Code:
  if (waitTimeout(isBusyFifoRead)) {  // <<--- this is polled
    return sdError(SD_CARD_ERROR_READ_FIFO);
  }
  for (uint32_t iw = 0 ; iw < 512/(4*FIFO_WML); iw++) {
    while (0 == (SDHC_PRSSTAT & SDHC_PRSSTAT_BREN)) {  // more polling.
    }
    for (uint32_t i = 0; i < FIFO_WML; i++) {
      p32[i] = SDHC_DATPORT;
    }
    p32 += FIFO_WML;
  }
  if (waitTimeout(isBusyTransferComplete)) {  // more polling
    return sdError(SD_CARD_ERROR_READ_TIMEOUT);
  }
So reading N sectors goes through this code N times.

An RTOS does work well for this kind of code - you just run it at lower priority and polling becomes the idle loop. The problem is finding a well supported RTOS for NXP.

I love ChibiOS but it was developed mainly for STM32 by the brilliant Giovanni Di Sirio. I ported it to Teensy but now mainly use it with STM32H7 so I can't recommend it because of no reliable support.
 
Hi Bill
Just as a point of info on RTOS - think the NXP SDK using a version of FreeRTOS - haven't played with it at all or even tried to get it working with the T4 but just wanted to let you know.
 
I ported FreeRTOS to Teensy 3.x six years ago. I would be cautious about FreeRTOS now that Amazon bought it for their IoT mission.

https://www.freertos.org/FAQ_Amazon.html

FreeRTOS is/was a simple kernel with no real framework for HAL. It is easy to port so almost all chip companies choose it. I don't call it an RTOS.

I recently downloaded it but am waiting to see where Amazon is going.
 
I just downloaded the 202107.00 version of FreeRTOS. Wow! It's 455MB.

The entire source for my port six years ago was 753 KB.

Be warned by comments like this:
This directory is in working progress -- we are migrating scattered test cases to this directory. Here only lists what's currently under this directory.

FreeRTOS VeriFast proofs
This directory contains unbounded proofs of the FreeRTOS kernel queue and list data structures. Unbounded proofs mean that these results hold independent of the length of the queue or list.

Informally, the queue proofs demonstrate that the queue implementation is memory safe (does not access invalid memory), thread safe (properly synchronizes accesses) and functionally correct (behaves like a queue) under any arbitrary number of tasks or ISRs. The list proofs demonstrate that the list implementation is memory safe and functionally correct.

These properties are proven with the VeriFast verifier. See the proof signoff document for more on the proof properties, assumptions, and simplifications.
 
Last edited:
Well, the ESP uses it too, I think.
Because the Teensy is notoriously poorly documented - even on the web you can hardly find any information - would not be a bad choice for this reason alone.
With one stroke many tutorials etc would be usable.

But unfortunately Paul has already rejected a RTOS several times.

So... maybe I'll have a look at it when the next Teensy is on the market sometime. Just to look how it went.
But OK, without RTOS the 2nd core can spend its time in polling-loops or state machines.

Meanwhile the chinese (ESP) switch to M7 and outpeform even the next Teensy -- just because their software is better. They already said they are not fixed to the current cpu.

:)

You can even now write faster programs than for T4 - if you need a lot of communication.
 
Hi Bill,
Tried your exact code from message #1. Got this error:

Untitled.png

Using Windows 10, Arduino 1.8.15, Teensyduino 1.54, SdFat lib 2.1.0., Teensy 4.1, SanDisk Ultra 16GB.

Warning during compilation:
Code:
..
[COLOR="#FF0000"]In file included from C:\Users\Paul\Documents\Arduino\Teensy4_SDcard-speed\Teensy4_SDcard-speed.ino:3:0:[/COLOR]
C:\Users\Paul\Documents\Arduino\libraries\SdFat\src/SdFat.h:438:2: warning: #warning File not defined because __has__include(FS.h) [-Wcpp]
 #warning File not defined because __has__include(FS.h)
  ^
Compiling libraries...
Compiling library "SdFat"
..
..
..
Multiple libraries were found for "SdFat.h"
 Used: C:\Users\Paul\Documents\Arduino\libraries\SdFat
 Not used: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SdFat
Using library SdFat at version 2.1.0 in folder: C:\Users\Paul\Documents\Arduino\libraries\SdFat 
Using library SPI at version 1.0 in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SPI

Am I missing something?

Paul
 
I preAllocate 16GB for files. change this to use 29 instead of 30:

Code:
const uint32_t FILE_ALLOC = 1UL << 30;

I wanted the files spread over the SD.
 
Last edited:
Changed 30 to 29 and now the serial monitor stops at sd.begin()

Untitled.png

Any idea what to try next? [I reformatted the SDcard in the meantime]

Thanks,
Paul
 
If this problem could be solved, would you consider supporting an async API (without RTOS)?

There is some hope for an async API with DMA but it is not worth doing.

Solving this type problem with an RTOS is better since it is a general solution and modern tick-less RTOSs have little extra overhead. Even a better solution for multi-processors.
 
Changed 30 to 29 and now the serial monitor stops at sd.begin()

I tried a 16GB card and it worked with 1.55. It was really slow with FAT32 to create files. Write latency was huge. It took forever to finish.

Try formatting with the SdFormater example or the SD Association formatter

Edit: this is how it ended:
ns: 1 nf: 4 maxLat: 108604 total KB/sec: 193.13 file KB/sec: 48.28
ns: 1 nf: 8 maxLat: 147372 total KB/sec: 145.82 file KB/sec: 18.23
ns: 1 nf: 16 maxLat: 125962 total KB/sec: 79.79 file KB/sec: 4.99
End Random Write Test
Type any character to remove files
Remove micros: 18725889
Done
 
Last edited:
One thing is certain, Teensy is not going to have an officially supported RTOS anytime soon. Maybe things will change in the farther future with Arduino officially supporting mbed. But whether Arduino mbed profoundly moves the Arduino ecosystem or ends up looking like Arduino Due is anyone's guess at this point. The last thing Teensy needs when people like Frank are already upset about documentation and lack of attention lower priority pull requests is piling on RTOS with a huge ecosystem of libraries not designed for RTOS use.

But RTOS or not, I personally feel an async API would be very much worthwhile. For hard real time use, when we've nearly consumed buffered data, what's truly needed is an API to request more to be read, whenever the hardware can. Then later when we run at the next hard real time slot, we hope the requested data was deposited into our buffer.

But imagine if we have a RTOS (which is ideal, none of the issues mentioned above), how then would that sort of hard real time code be constructed? We'd have a thread, rather than an interrupt, which does the same hard real time DSP work. But what will that thread do when it has nearly consumed buffered data? It can't just call a blocking API, because that thread still has a *lot* more DSP number crunching to be done if we allow users to fully utilize the CPU and still meet the hard real time requirement. The DSP thread can never sit and wait. So maybe we have a 2nd data reading thread which is responsible for doing the blocking reads? Then the DSP thread would use a semaphore or some other RTOS mechanism to signal the data reading thread that it needs more data. The data reading thread would call the blocking read function, and when it returns the data thread would set a flag or otherwise do something the DSP thread can use to know whether new data is in the buffer (or if not, it has to make do without data - the DSP thread can never sit and wait).

Maybe that sort of using multiple threads and semaphores to communicate between them is the utopia RTOS fans love. But for a hard real time application, we fundamentally need a non-blocking way to request data we'll need in the future. Sure, a solid RTOS would give us a way to build that non-blocking data request with multiple threads. But just having a non-blocking API would be so much simpler for hard real time usage.
 
Well, that SD Association formatter did the trick! Thanks.

Here is the serial monitor output:
Code:
Type any character to start
Create files
Create micros: 460486
Sequential Write: 18480.16 KB/sec
Begin Random Read Test
ns - read size sectors, nf - number of files, maxLat - latency micros
ns: 64 nf: 1 maxLat: 2143 total KB/sec: 22502.60 file KB/sec: 22502.60
ns: 64 nf: 2 maxLat: 2139 total KB/sec: 16310.98 file KB/sec: 8155.49
ns: 64 nf: 4 maxLat: 2138 total KB/sec: 16303.63 file KB/sec: 4075.91
ns: 64 nf: 8 maxLat: 2138 total KB/sec: 16313.77 file KB/sec: 2039.22
ns: 64 nf: 16 maxLat: 2139 total KB/sec: 16315.22 file KB/sec: 1019.70
ns: 32 nf: 1 maxLat: 1426 total KB/sec: 22499.22 file KB/sec: 22499.22
ns: 32 nf: 2 maxLat: 1432 total KB/sec: 14405.79 file KB/sec: 7202.90
ns: 32 nf: 4 maxLat: 1432 total KB/sec: 14396.15 file KB/sec: 3599.04
ns: 32 nf: 8 maxLat: 1432 total KB/sec: 14406.46 file KB/sec: 1800.81
ns: 32 nf: 16 maxLat: 1432 total KB/sec: 14410.09 file KB/sec: 900.63
ns: 16 nf: 1 maxLat: 1069 total KB/sec: 22485.71 file KB/sec: 22485.71
ns: 16 nf: 2 maxLat: 1325 total KB/sec: 11349.70 file KB/sec: 5674.85
ns: 16 nf: 4 maxLat: 1336 total KB/sec: 11365.23 file KB/sec: 2841.31
ns: 16 nf: 8 maxLat: 1332 total KB/sec: 11384.14 file KB/sec: 1423.02
ns: 16 nf: 16 maxLat: 1333 total KB/sec: 11393.93 file KB/sec: 712.12
ns: 8 nf: 1 maxLat: 884 total KB/sec: 22462.59 file KB/sec: 22462.59
ns: 8 nf: 2 maxLat: 895 total KB/sec: 8200.42 file KB/sec: 4100.21
ns: 8 nf: 4 maxLat: 894 total KB/sec: 8204.96 file KB/sec: 2051.24
ns: 8 nf: 8 maxLat: 898 total KB/sec: 8213.02 file KB/sec: 1026.63
ns: 8 nf: 16 maxLat: 901 total KB/sec: 8216.21 file KB/sec: 513.51
ns: 4 nf: 1 maxLat: 802 total KB/sec: 22408.34 file KB/sec: 22408.34
ns: 4 nf: 2 maxLat: 870 total KB/sec: 5151.75 file KB/sec: 2575.87
ns: 4 nf: 4 maxLat: 813 total KB/sec: 5157.75 file KB/sec: 1289.44
ns: 4 nf: 8 maxLat: 820 total KB/sec: 5163.44 file KB/sec: 645.43
ns: 4 nf: 16 maxLat: 826 total KB/sec: 5166.81 file KB/sec: 322.93
ns: 2 nf: 1 maxLat: 757 total KB/sec: 22322.00 file KB/sec: 22322.00
ns: 2 nf: 2 maxLat: 760 total KB/sec: 2997.93 file KB/sec: 1498.97
ns: 2 nf: 4 maxLat: 757 total KB/sec: 3000.17 file KB/sec: 750.04
ns: 2 nf: 8 maxLat: 760 total KB/sec: 3002.70 file KB/sec: 375.34
ns: 2 nf: 16 maxLat: 760 total KB/sec: 3004.95 file KB/sec: 187.81
ns: 1 nf: 1 maxLat: 735 total KB/sec: 22236.79 file KB/sec: 22236.79
ns: 1 nf: 2 maxLat: 735 total KB/sec: 1655.76 file KB/sec: 827.88
ns: 1 nf: 4 maxLat: 735 total KB/sec: 1656.63 file KB/sec: 414.16
ns: 1 nf: 8 maxLat: 735 total KB/sec: 1657.92 file KB/sec: 207.24
ns: 1 nf: 16 maxLat: 737 total KB/sec: 1658.45 file KB/sec: 103.65
End Random Read Test
Begin Random Write Test
ns - read size sectors, nf - number of files, maxLat - latency micros
ns: 64 nf: 1 maxLat: 4031 total KB/sec: 21553.02 file KB/sec: 21553.02
ns: 64 nf: 2 maxLat: 5686 total KB/sec: 10010.22 file KB/sec: 5005.11
ns: 64 nf: 4 maxLat: 33204 total KB/sec: 8648.46 file KB/sec: 2162.11
ns: 64 nf: 8 maxLat: 33632 total KB/sec: 9231.05 file KB/sec: 1153.88
ns: 64 nf: 16 maxLat: 77336 total KB/sec: 8657.42 file KB/sec: 541.09
ns: 32 nf: 1 maxLat: 2049 total KB/sec: 22114.86 file KB/sec: 22114.86
ns: 32 nf: 2 maxLat: 25243 total KB/sec: 6403.71 file KB/sec: 3201.86
ns: 32 nf: 4 maxLat: 10075 total KB/sec: 7069.94 file KB/sec: 1767.48
ns: 32 nf: 8 maxLat: 79425 total KB/sec: 6706.00 file KB/sec: 838.25
ns: 32 nf: 16 maxLat: 69522 total KB/sec: 6551.14 file KB/sec: 409.45
ns: 16 nf: 1 maxLat: 2190 total KB/sec: 21381.62 file KB/sec: 21381.62
ns: 16 nf: 2 maxLat: 31955 total KB/sec: 4928.32 file KB/sec: 2464.16
ns: 16 nf: 4 maxLat: 10273 total KB/sec: 5127.13 file KB/sec: 1281.78
ns: 16 nf: 8 maxLat: 65821 total KB/sec: 4730.15 file KB/sec: 591.27
ns: 16 nf: 16 maxLat: 106115 total KB/sec: 4734.90 file KB/sec: 295.93
ns: 8 nf: 1 maxLat: 2043 total KB/sec: 20880.90 file KB/sec: 20880.90
ns: 8 nf: 2 maxLat: 115878 total KB/sec: 2738.54 file KB/sec: 1369.27
ns: 8 nf: 4 maxLat: 106981 total KB/sec: 3431.75 file KB/sec: 857.94
ns: 8 nf: 8 maxLat: 53867 total KB/sec: 3131.30 file KB/sec: 391.41
ns: 8 nf: 16 maxLat: 127302 total KB/sec: 2898.20 file KB/sec: 181.14
ns: 4 nf: 1 maxLat: 1227 total KB/sec: 22190.21 file KB/sec: 22190.21
ns: 4 nf: 2 maxLat: 116912 total KB/sec: 1315.69 file KB/sec: 657.84
ns: 4 nf: 4 maxLat: 17457 total KB/sec: 1713.60 file KB/sec: 428.40
ns: 4 nf: 8 maxLat: 132388 total KB/sec: 1587.83 file KB/sec: 198.48
ns: 4 nf: 16 maxLat: 133049 total KB/sec: 1367.36 file KB/sec: 85.46
ns: 2 nf: 1 maxLat: 1287 total KB/sec: 21962.01 file KB/sec: 21962.01
ns: 2 nf: 2 maxLat: 77946 total KB/sec: 755.74 file KB/sec: 377.87
ns: 2 nf: 4 maxLat: 29910 total KB/sec: 779.01 file KB/sec: 194.75
ns: 2 nf: 8 maxLat: 115694 total KB/sec: 726.03 file KB/sec: 90.75
ns: 2 nf: 16 maxLat: 255972 total KB/sec: 602.60 file KB/sec: 37.66
ns: 1 nf: 1 maxLat: 1157 total KB/sec: 21732.60 file KB/sec: 21732.60
ns: 1 nf: 2 maxLat: 117636 total KB/sec: 378.15 file KB/sec: 189.08
ns: 1 nf: 4 maxLat: 144196 total KB/sec: 259.66 file KB/sec: 64.92
ns: 1 nf: 8 maxLat: 142011 total KB/sec: 353.67 file KB/sec: 44.21
ns: 1 nf: 16 maxLat: 152148 total KB/sec: 286.10 file KB/sec: 17.88
End Random Write Test
Type any character to remove files
Remove micros: 441811
Done

Sandisk part#: SDSQUAR-016G-GN6MA

Paul
 
No, I'm not upset about "lack of attention" or documentation. The one who needs the documentation for "Teensy" the least is me. I'm totally surprised that you think I need Teensy docs?! Recently we explained LDREX/STREX to you. However, it is important for YOUR users. In most cases, I speak for other users (and try to help them). Also regarding bugs and other PRs. I don't think you understood that.
And it's perfectly fine that bugs with higher priority have higher priority than those with lower :) If there are such. No, bugs should always have a high priority. That's what needs more attention. And responding to issues.
When I reported a little, really unimportant issue to Bill, it was fixed within one day.

So, this just because you started it here. There are other things i'm upset about. In sum.

That you don't want RTOS is a big mistake in my opinion.
piling on RTOS with a huge ecosystem of libraries not designed for RTOS use.
Strangely enough, many people are very happy with ESP, and there are hardly any problems re: RTOS. Indeed, the important libraries have long since been adapted.

But as I said, I'll look at it from a distance, and maybe go back to other MCUs. I have a stack of STMs lying here, and a drawer full of ESPs that are very exciting because of bluetooth, wifi (and also re:audio!).
I have my personal challenge webradios. I've now built 5 of them, and each gets better. Only one with Teensy.
 
That you don't want RTOS is a big mistake in my opinion.

I agree. After some thought, I think FreeRTOS would be a good kernel to transition to a RTOS, provided Amazon supports the simple kernel.

I have used a RTOS in every serious project since RSX-11/M in the mid 1970s.

I tried to be an evangelist for an Arduino RTOS over eight years ago. I ported FreeRTOS and ChibiOS to Arduino. It is hopeless unless the RTOS is adopted as part of the kernel.

I would like to see key devices supported. ChibiOS has driver models for: ADC, CAN, DAC, EXT, GPT, I2C, I2S, ICU, MAC, MMC, PAL, PWM, RTC, SDC, Serial, UART, USB, USB-CDC, SPI, ST, WDG.

Just having a good kernel would be a good start. It wouldn't take that long to transition key libraries. A good kernel allows great freedom for bare interrupts for things like DSP.

If you choose a sensible kernel, you can easily transition to other kernels. NASA has done this.

See:

http://chibiforge.org/doc/21.6/hal/modules.html
 
Last edited:
------------------------------------------------------
I ran your benchmark on a 512GB Sandisk Extreme:
Code:
512GB Samsung Extreme
----------------------------------------------------------
Type any character to start
Create files
Create micros: 125382
Sequential Write: 21337.86 KB/sec
Begin Random Read Test
ns - read size sectors, nf - number of files, maxLat - latency micros
ns: 64 nf: 1 maxLat: 1685 total KB/sec: 22876.69 file KB/sec: 22876.69
ns: 64 nf: 2 maxLat: 2601 total KB/sec: 14287.04 file KB/sec: 7143.52
ns: 64 nf: 4 maxLat: 2773 total KB/sec: 14350.05 file KB/sec: 3587.51
ns: 64 nf: 8 maxLat: 2767 total KB/sec: 14310.98 file KB/sec: 1788.87
ns: 64 nf: 16 maxLat: 2779 total KB/sec: 13415.40 file KB/sec: 838.46
ns: 32 nf: 1 maxLat: 974 total KB/sec: 22870.70 file KB/sec: 22870.70
ns: 32 nf: 2 maxLat: 1886 total KB/sec: 12705.08 file KB/sec: 6352.54
ns: 32 nf: 4 maxLat: 1883 total KB/sec: 12772.17 file KB/sec: 3193.04
ns: 32 nf: 8 maxLat: 1889 total KB/sec: 12734.85 file KB/sec: 1591.86
ns: 32 nf: 16 maxLat: 2064 total KB/sec: 11344.68 file KB/sec: 709.04
ns: 16 nf: 1 maxLat: 618 total KB/sec: 22858.24 file KB/sec: 22858.24
ns: 16 nf: 2 maxLat: 1957 total KB/sec: 7702.39 file KB/sec: 3851.19
ns: 16 nf: 4 maxLat: 1958 total KB/sec: 7711.56 file KB/sec: 1927.89
ns: 16 nf: 8 maxLat: 1960 total KB/sec: 7701.31 file KB/sec: 962.66
ns: 16 nf: 16 maxLat: 2135 total KB/sec: 6703.15 file KB/sec: 418.95
ns: 8 nf: 1 maxLat: 439 total KB/sec: 22837.33 file KB/sec: 22837.33
ns: 8 nf: 2 maxLat: 973 total KB/sec: 7754.42 file KB/sec: 3877.21
ns: 8 nf: 4 maxLat: 989 total KB/sec: 7754.74 file KB/sec: 1938.68
ns: 8 nf: 8 maxLat: 989 total KB/sec: 7729.61 file KB/sec: 966.20
ns: 8 nf: 16 maxLat: 1169 total KB/sec: 5930.34 file KB/sec: 370.65
ns: 4 nf: 1 maxLat: 350 total KB/sec: 22780.27 file KB/sec: 22780.27
ns: 4 nf: 2 maxLat: 546 total KB/sec: 4954.42 file KB/sec: 2477.21
ns: 4 nf: 4 maxLat: 525 total KB/sec: 4948.00 file KB/sec: 1237.00
ns: 4 nf: 8 maxLat: 523 total KB/sec: 4940.77 file KB/sec: 617.60
ns: 4 nf: 16 maxLat: 679 total KB/sec: 3559.13 file KB/sec: 222.45
ns: 2 nf: 1 maxLat: 306 total KB/sec: 22693.99 file KB/sec: 22693.99
ns: 2 nf: 2 maxLat: 545 total KB/sec: 2742.73 file KB/sec: 1371.36
ns: 2 nf: 4 maxLat: 524 total KB/sec: 2740.65 file KB/sec: 685.16
ns: 2 nf: 8 maxLat: 523 total KB/sec: 2735.42 file KB/sec: 341.93
ns: 2 nf: 16 maxLat: 643 total KB/sec: 1911.21 file KB/sec: 119.45
ns: 1 nf: 1 maxLat: 284 total KB/sec: 22608.85 file KB/sec: 22608.85
ns: 1 nf: 2 maxLat: 459 total KB/sec: 1466.88 file KB/sec: 733.44
ns: 1 nf: 4 maxLat: 503 total KB/sec: 1465.84 file KB/sec: 366.46
ns: 1 nf: 8 maxLat: 519 total KB/sec: 1461.79 file KB/sec: 182.72
ns: 1 nf: 16 maxLat: 617 total KB/sec: 1000.06 file KB/sec: 62.50
End Random Read Test
Begin Random Write Test
ns - read size sectors, nf - number of files, maxLat - latency micros
ns: 64 nf: 1 maxLat: 2004 total KB/sec: 22258.98 file KB/sec: 22258.98
ns: 64 nf: 2 maxLat: 6429 total KB/sec: 10412.56 file KB/sec: 5206.28
ns: 64 nf: 4 maxLat: 3107 total KB/sec: 11517.88 file KB/sec: 2879.47
ns: 64 nf: 8 maxLat: 9092 total KB/sec: 11195.05 file KB/sec: 1399.38
ns: 64 nf: 16 maxLat: 10323 total KB/sec: 11219.35 file KB/sec: 701.21
ns: 32 nf: 1 maxLat: 1283 total KB/sec: 22306.81 file KB/sec: 22306.81
ns: 32 nf: 2 maxLat: 9614 total KB/sec: 6696.10 file KB/sec: 3348.05
ns: 32 nf: 4 maxLat: 6840 total KB/sec: 7968.61 file KB/sec: 1992.15
ns: 32 nf: 8 maxLat: 5950 total KB/sec: 8755.27 file KB/sec: 1094.41
ns: 32 nf: 16 maxLat: 12343 total KB/sec: 8802.94 file KB/sec: 550.18
ns: 16 nf: 1 maxLat: 918 total KB/sec: 22237.74 file KB/sec: 22237.74
ns: 16 nf: 2 maxLat: 30715 total KB/sec: 4191.76 file KB/sec: 2095.88
ns: 16 nf: 4 maxLat: 21502 total KB/sec: 5271.48 file KB/sec: 1317.87
ns: 16 nf: 8 maxLat: 6757 total KB/sec: 6012.66 file KB/sec: 751.58
ns: 16 nf: 16 maxLat: 10382 total KB/sec: 6162.75 file KB/sec: 385.17
ns: 8 nf: 1 maxLat: 736 total KB/sec: 22235.85 file KB/sec: 22235.85
ns: 8 nf: 2 maxLat: 6239 total KB/sec: 2353.57 file KB/sec: 1176.78
ns: 8 nf: 4 maxLat: 6123 total KB/sec: 3065.46 file KB/sec: 766.36
ns: 8 nf: 8 maxLat: 6513 total KB/sec: 3523.65 file KB/sec: 440.46
ns: 8 nf: 16 maxLat: 29126 total KB/sec: 3762.57 file KB/sec: 235.16
ns: 4 nf: 1 maxLat: 642 total KB/sec: 22235.38 file KB/sec: 22235.38
ns: 4 nf: 2 maxLat: 7893 total KB/sec: 1080.77 file KB/sec: 540.39
ns: 4 nf: 4 maxLat: 4596 total KB/sec: 1328.97 file KB/sec: 332.24
ns: 4 nf: 8 maxLat: 5466 total KB/sec: 1490.57 file KB/sec: 186.32
ns: 4 nf: 16 maxLat: 20929 total KB/sec: 1527.27 file KB/sec: 95.45
ns: 2 nf: 1 maxLat: 596 total KB/sec: 22259.92 file KB/sec: 22259.92
ns: 2 nf: 2 maxLat: 73283 total KB/sec: 499.17 file KB/sec: 249.58
ns: 2 nf: 4 maxLat: 6320 total KB/sec: 597.19 file KB/sec: 149.30
ns: 2 nf: 8 maxLat: 20736 total KB/sec: 650.71 file KB/sec: 81.34
ns: 2 nf: 16 maxLat: 25996 total KB/sec: 669.20 file KB/sec: 41.82
ns: 1 nf: 1 maxLat: 578 total KB/sec: 22243.40 file KB/sec: 22243.40
ns: 1 nf: 2 maxLat: 25044 total KB/sec: 247.07 file KB/sec: 123.54
ns: 1 nf: 4 maxLat: 5079 total KB/sec: 284.81 file KB/sec: 71.20
ns: 1 nf: 8 maxLat: 25225 total KB/sec: 304.63 file KB/sec: 38.08
ns: 1 nf: 16 maxLat: 23084 total KB/sec: 313.71 file KB/sec: 19.61
End Random Write Test
Type any character to remove files
Remove micros: 83279
Done
 
Back
Top