Comment #2 on issue 50 by kidjan: Extremely Poor Performace with Native
Win32 - Std Fileprovider
http://code.google.com/p/mp4v2/issues/detail?id=50
jeffreyloden,
Could you try this again with the most recent trunk? And is there some way
you could give me your test code so I could try and repeat it? There were
some more changes to the native windows functions (mostly to deal with
unicode), but I'd like to know if you still have the same issues.
One thought I had is to improve the file provider abstraction so users can
more easily create their own read/write routines (in particular, I'd like
to write one using Qt).
Thanks,
kidjan
Just to see, I tried this with the most current rev, and the problem still
exists. Not sure if there are any developers that run on Windows, but if
so, my fix greatly speeds up reads and writes. I would be glad to work
with anyone that would be interested in getting this into the sources.
Very easy to test, on Windows run a read and a write with and without the
changes and notice the speedup. I've got thousands of users using my
version and I've never had a problem with it.
Dan
What happens if you change the flags used? For example, see:
http://msdn.microsoft.com/en-us/library/aa363858.aspx#caching_behavior
...in particular,
"Specifying the FILE_FLAG_SEQUENTIAL_SCAN flag can increase performance for
applications that read large files using sequential access. Performance
gains can be even more noticeable for applications that read large files
mostly sequentially, but occasionally skip forward over small ranges of
bytes. If an application moves the file pointer for random access, optimum
caching performance most likely will not occur. However, correct operation
is still guaranteed."
Looks like the code is currently using FILE_ATTRIBUTE_NORMAL (see
http://code.google.com/p/mp4v2/issues/attachmentText?id=50&aid=-802417126500239040&name=File_win32.cpp&token=4idgdzVy-fM3qodZaF02-OC04Xs%3A1332118380013#46
); might be interesting to see what happens if you put in
FILE_FLAG_SEQUENTIAL_SCAN since most MP4 file reading probably "read(s)
large files mostly sequentially, but occasionally skip forward over small
ranges of bytes"
Not opposed to the patch, but I'd prefer a solution that leveraged the
existing file API rather than caching in user land.
Also, this sort of sheds some light on this API:
http://blogs.msdn.com/b/oldnewthing/archive/2012/01/20/10258690.aspx
So, the weird thing is if an application passes in neither
FILE_FLAG_SEQUENTIAL_SCAN or FILE_FLAG_RANDOM_ACCESS, then the underlying
API goes into some sort of heuristic mode where it tries to optimize
performance based on the calls coming in. Also, it seems that this
behavior may not be consistent across Windows OSs.
It has to be said: what a *shit* API this is. The documentation alone
really shows you how convoluted it is. I wouldn't be opposed to going back
to the more portable way (fopen/fread/fseek) and doing away with this
windows specific file provider all together.
Going back to fopen/fread/fseek has some pretty big drawbacks too: can't
read filenames with non-ascii characters and can't read filenames that live
in long paths.
I've been super delinquent in not trying Dan's patch for ages. There may
be some light at the end of the tunnel for me but given my past
performance, is there someone else who can take a look at his patch and
work through any changes (if there are any) with him and get it committed?
Thanks much.
-DB
Before we do any patches, somebody needs to at least try
FILE_FLAG_SEQUENTIAL_SCAN to see if that resolves the performance issues.