<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Donkblog : Windows</title><link>http://blogs.msdn.com/brandonturner/archive/tags/Windows/default.aspx</link><description>Tags: Windows</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>It Is Nice To Be At The Top Of The Food Chain</title><link>http://blogs.msdn.com/brandonturner/archive/2008/02/26/it-is-nice-to-be-at-the-top-of-the-food-chain.aspx</link><pubDate>Tue, 26 Feb 2008 18:27:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7905643</guid><dc:creator>Brandon Turner</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/brandonturner/comments/7905643.aspx</comments><wfw:commentRss>http://blogs.msdn.com/brandonturner/commentrss.aspx?PostID=7905643</wfw:commentRss><description>&lt;h4&gt;&lt;u&gt;The Back Story&lt;/u&gt; &lt;/h4&gt;  &lt;p&gt;A very long time ago, maybe it was even as much as 2 years ago now, I wanted to answer the question 'Just how much overhead is there using one API call compared to another API call?'.&amp;nbsp; This question came to mind after I realized just how many ways there was to move a file.&amp;nbsp; So I wrote a simple command line application to track just that.&amp;nbsp;&amp;nbsp; &lt;/p&gt;  &lt;p&gt;The application moved a file back and fourth 5000 times using a certain method, and I recorded the results' averages(excluding times when the disk cache caused really bad results):&lt;/p&gt;  &lt;table border="1" cellpadding="2" cellspacing="0" width="147"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="71"&gt;Slowest&lt;/td&gt;        &lt;td valign="top" width="74"&gt;2230ms&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="76"&gt;Slow&lt;/td&gt;        &lt;td valign="top" width="74"&gt;1540ms&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="80"&gt;Fast&lt;/td&gt;        &lt;td valign="top" width="74"&gt;1240ms&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="84"&gt;Fastest&lt;/td&gt;        &lt;td valign="top" width="74"&gt;1060ms&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h4&gt;&lt;u&gt;Why does this happen?&lt;/u&gt;&lt;/h4&gt;  &lt;p&gt;Well there is a lot of overhead in just the functions calling other functions further up the chain, and converting the text to unicode in some cases.&amp;nbsp; If I had to take a guess, the call stack would look something like this from the slowest method:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;NtSetInformationFile &lt;/li&gt;    &lt;li&gt;MoveFileWithProgressW &lt;/li&gt;    &lt;li&gt;MoveFileExW &lt;/li&gt;    &lt;li&gt;MoveFileW &lt;/li&gt;    &lt;li&gt;wrename &lt;/li&gt;    &lt;li&gt;rename &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h4&gt;&lt;u&gt;Show Me The Code&lt;/u&gt;&lt;/h4&gt;  &lt;p&gt;Part of the source code was written by &lt;a href="http://www.alex-ionescu.com" mce_href="http://www.alex-ionescu.com"&gt;Alex Ionescu&lt;/a&gt; and I have removed a few parts of the code because it used undocumented behavior in the 'Fastest' method.&amp;nbsp; This code was compiled without optimization(turning them on may even fix this problem for you) using the mingw compiler.&amp;nbsp;&amp;nbsp; &lt;/p&gt;  &lt;pre class="csharpcode"&gt;CALLBACK&lt;br&gt;WinMain(__in HINSTANCE hInstance,&lt;br&gt;        __in_opt HINSTANCE hPrevInstance,&lt;br&gt;        __in_opt LPSTR lpCmdLine,&lt;br&gt;        __in &lt;span class="kwrd"&gt;int&lt;/span&gt; nShowCmd)&lt;br&gt;{&lt;br&gt;    MSG Msg;&lt;br&gt; &lt;br&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; i;&lt;br&gt;    DWORD Start, End;&lt;br&gt; &lt;br&gt;    Start = GetTickCount();&lt;br&gt; &lt;br&gt;    &lt;span class="kwrd"&gt;for&lt;/span&gt;(i = 0; i &amp;lt; 5000; i++)&lt;br&gt;    {&lt;br&gt;&lt;span class="preproc"&gt;#ifdef SLOWEST&lt;/span&gt;&lt;br&gt;        &lt;a href="http://msdn2.microsoft.com/en-us/library/zw5t957f%28VS.71%29.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/zw5t957f(VS.71).aspx"&gt;rename&lt;/a&gt;(&lt;span class="str"&gt;"C:\\Temp\\foo.exe"&lt;/span&gt;,&lt;span class="str"&gt;"C:\\Temp\\bar.exe"&lt;/span&gt;);&lt;br&gt;        rename(&lt;span class="str"&gt;"C:\\Temp\\bar.exe"&lt;/span&gt;,&lt;span class="str"&gt;"C:\\Temp\\foo.exe"&lt;/span&gt;);&lt;br&gt;&lt;span class="preproc"&gt;#endif&lt;/span&gt; &lt;span class="rem"&gt;/* SLOWEST */&lt;/span&gt;&lt;br&gt; &lt;br&gt;&lt;span class="preproc"&gt;#ifdef SLOW&lt;/span&gt;&lt;br&gt;        &lt;a href="http://msdn2.microsoft.com/en-us/library/aa365239.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa365239.aspx"&gt;MoveFileA&lt;/a&gt;(&lt;span class="str"&gt;"C:\\Temp\\foo.exe"&lt;/span&gt;,&lt;span class="str"&gt;"C:\\Temp\\bar.exe"&lt;/span&gt;);&lt;br&gt;        MoveFileA(&lt;span class="str"&gt;"C:\\Temp\\bar.exe"&lt;/span&gt;,&lt;span class="str"&gt;"C:\\Temp\\foo.exe"&lt;/span&gt;);&lt;br&gt;&lt;span class="preproc"&gt;#endif&lt;/span&gt; &lt;span class="rem"&gt;/* SLOW */&lt;/span&gt;&lt;br&gt; &lt;br&gt;&lt;span class="preproc"&gt;#ifdef FAST&lt;/span&gt;&lt;br&gt;        &lt;a href="http://msdn2.microsoft.com/en-us/library/aa365242%28VS.85%29.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa365242(VS.85).aspx"&gt;MoveFileWithProgressW&lt;/a&gt;(L&lt;span class="str"&gt;"C:\\Temp\\foo.exe"&lt;/span&gt;,L&lt;span class="str"&gt;"C:\\Temp\\bar.exe"&lt;/span&gt;, NULL, NULL, MOVEFILE_COPY_ALLOWED);&lt;br&gt;        MoveFileWithProgressW(L&lt;span class="str"&gt;"C:\\Temp\\bar.exe"&lt;/span&gt;,L&lt;span class="str"&gt;"C:\\Temp\\foo.exe"&lt;/span&gt;, NULL, NULL, MOVEFILE_COPY_ALLOWED);&lt;br&gt;&lt;span class="preproc"&gt;#endif&lt;/span&gt; &lt;span class="rem"&gt;/* FAST */&lt;/span&gt;&lt;br&gt; &lt;br&gt;&lt;span class="preproc"&gt;#ifdef FASTEST&lt;/span&gt;&lt;br&gt;        {&lt;br&gt;        &lt;span class="rem"&gt;// Shared Variables&lt;/span&gt;&lt;br&gt;        NTSTATUS Status;&lt;br&gt;        &lt;a href="http://mtbeta.msdn.microsoft.com/en-us/library/ms806097.aspx" mce_href="http://mtbeta.msdn.microsoft.com/en-us/library/ms806097.aspx"&gt;IO_STATUS_BLOCK&lt;/a&gt; IoStatusBlock;&lt;br&gt;        HANDLE Handle;&lt;br&gt; &lt;br&gt;        &lt;span class="rem"&gt;// Open the old file and tell NT we plan to delete it&lt;/span&gt;&lt;br&gt;        Status = &lt;a href="http://msdn2.microsoft.com/en-us/library/bb432381.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/bb432381.aspx"&gt;NtOpenFile&lt;/a&gt;(&lt;span class="rem"&gt;/* Remove */&lt;/span&gt;);&lt;br&gt; &lt;br&gt;        &lt;span class="rem"&gt;// Do the first rename&lt;/span&gt;&lt;br&gt;        Status = &lt;a href="http://mtbeta.msdn.microsoft.com/en-us/library/ms804363.aspx" mce_href="http://mtbeta.msdn.microsoft.com/en-us/library/ms804363.aspx"&gt;NtSetInformationFile&lt;/a&gt;(&lt;span class="rem"&gt;/* Remove */&lt;/span&gt;);&lt;br&gt; &lt;br&gt;        &lt;span class="rem"&gt;// Close the handle&lt;/span&gt;&lt;br&gt;        NtClose(Handle);&lt;br&gt;&lt;br&gt;        &lt;span class="rem"&gt;// Open the new file and tell NT we plan to delete it&lt;/span&gt;&lt;br&gt;        Status = NtOpenFile(&lt;span class="rem"&gt;/* Remove */&lt;/span&gt;);&lt;br&gt; &lt;br&gt;        &lt;span class="rem"&gt;// Do the 2nd rename&lt;/span&gt;&lt;br&gt;        Status = NtSetInformationFile(&lt;span class="rem"&gt;/* Remove */&lt;/span&gt;);&lt;br&gt; &lt;br&gt;        NtClose(Handle);&lt;br&gt;        }&lt;br&gt;&lt;span class="preproc"&gt;#endif&lt;/span&gt; &lt;span class="rem"&gt;/* FASTEST */&lt;/span&gt;&lt;br&gt;    }&lt;br&gt; &lt;br&gt;    End = GetTickCount();&lt;br&gt; &lt;br&gt;    printf(&lt;span class="str"&gt;"%d -- %d\n"&lt;/span&gt;,(End - Start),GetLastError());&lt;br&gt;&lt;br&gt;    system(&lt;span class="str"&gt;"pause"&lt;/span&gt;);&lt;br&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; 0;&lt;br&gt;    }&lt;/pre&gt;
&lt;style type="text/css"&gt;




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7905643" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/brandonturner/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/brandonturner/archive/tags/Win32/default.aspx">Win32</category><category domain="http://blogs.msdn.com/brandonturner/archive/tags/Windows/default.aspx">Windows</category></item></channel></rss>