Performance of system/dos function

20 views (last 30 days)
Xiangrui Li
Xiangrui Li on 3 May 2017
Commented: Horshack Horshack on 20 Apr 2021
[status, cmdout] = system(cmd)
has been reported to be slow for a while (see this and this), but there seems no satisfying solution yet.
Here is what I tested for Windows command reg.exe, trying to figure out a workaround.
cmd = 'reg.exe query HKEY_LOCAL_MACHINE\HARDWARE /s'; % as an example
tic; [status, cmdout] = system(cmd); toc
Elapsed time is 3.517736 seconds.
whos cmdout
Name Size Bytes Class Attributes
cmdout 1x95249 190498 char
tic; [status, cmdout] = dos(cmd); toc
Elapsed time is 3.512847 seconds.
tic; cmdout = evalc(['! ' cmd]); toc
Elapsed time is 3.509961 seconds.
As we can see, system(), dos() and evalc('!') have similar performance. When I test the same cmd in other programs (Octave and python), it takes about 0.6 to 0.7 seconds. Running it at Windows command prompt takes less than a second based on my eye test. Then I tried to redirect output to a file:
tic; [status, cmdout] = system([cmd ' >myFile']); toc
Elapsed time is 0.886915 seconds.
This improves the performance significantly. The cmdout is empty now as expected.
Does this suggest there should be a way to improve system() for dealing with cmdout?
Is there a way to redirect cmdout to a Matlab string, so we can avoid to read and delete the temp file?
  7 Comments
Xiangrui Li
Xiangrui Li on 17 May 2018
The jsystem at Github has fixed the hanging problem.
Horshack Horshack
Horshack Horshack on 20 Apr 2021
I'm having the same issue. To demonstrate, I wrote a simple C program 'printstdout' that prints the number of characters it's been told to via a command line argument:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
int numCharsToPrint = argc >= 2 ? atoi(argv[1]) : 0;
int numCharsPrintedThisLine;
numCharsPrintedThisLine = 0;
while (numCharsToPrint-- > 0) {
printf("*");
if (++numCharsPrintedThisLine == 78) {
numCharsPrintedThisLine = 0;
if (numCharsToPrint-- > 0)
printf("\n");
}
}
return 0;
}
And tested it with the following script:
numChars = uint32(1);
while (numChars <= 2^20)
fprintf("numChars = %7d: ", numChars);
tic; [exitCode, output] = system(['printstdout ' num2str(numChars)]); toc;
numChars = numChars*2;
end
Here's the output for Matlab:
numChars = 1: Elapsed time is 0.035415 seconds.
numChars = 2: Elapsed time is 0.034140 seconds.
numChars = 4: Elapsed time is 0.033591 seconds.
numChars = 8: Elapsed time is 0.034396 seconds.
numChars = 16: Elapsed time is 0.033863 seconds.
numChars = 32: Elapsed time is 0.033824 seconds.
numChars = 64: Elapsed time is 0.033170 seconds.
numChars = 128: Elapsed time is 0.033617 seconds.
numChars = 256: Elapsed time is 0.033296 seconds.
numChars = 512: Elapsed time is 0.034161 seconds.
numChars = 1024: Elapsed time is 0.032989 seconds.
numChars = 2048: Elapsed time is 0.033904 seconds.
numChars = 4096: Elapsed time is 0.602469 seconds.
numChars = 8192: Elapsed time is 0.703521 seconds.
numChars = 16384: Elapsed time is 0.903753 seconds.
numChars = 32768: Elapsed time is 1.304120 seconds.
numChars = 65536: Elapsed time is 2.105577 seconds.
numChars = 131072: Elapsed time is 3.708676 seconds.
numChars = 262144: Elapsed time is 6.916353 seconds.
numChars = 524288: Elapsed time is 13.246939 seconds.
numChars = 1048576: Elapsed time is 26.452178 seconds.
And here is the output from Octave:
numChars = 1: Elapsed time is 0.0197449 seconds.
numChars = 2: Elapsed time is 0.0113029 seconds.
numChars = 4: Elapsed time is 0.0113032 seconds.
numChars = 8: Elapsed time is 0.0113418 seconds.
numChars = 16: Elapsed time is 0.011956 seconds.
numChars = 32: Elapsed time is 0.010741 seconds.
numChars = 64: Elapsed time is 0.011215 seconds.
numChars = 128: Elapsed time is 0.0108809 seconds.
numChars = 256: Elapsed time is 0.011487 seconds.
numChars = 512: Elapsed time is 0.010798 seconds.
numChars = 1024: Elapsed time is 0.012202 seconds.
numChars = 2048: Elapsed time is 0.0105009 seconds.
numChars = 4096: Elapsed time is 0.0121739 seconds.
numChars = 8192: Elapsed time is 0.01156 seconds.
numChars = 16384: Elapsed time is 0.0121598 seconds.
numChars = 32768: Elapsed time is 0.0127161 seconds.
numChars = 65536: Elapsed time is 0.014755 seconds.
numChars = 131072: Elapsed time is 0.0170429 seconds.
numChars = 262144: Elapsed time is 0.023046 seconds.
numChars = 524288: Elapsed time is 0.0346019 seconds.
numChars = 1048576: Elapsed time is 0.0581162 seconds.

Sign in to comment.

Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!