<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:微软雅黑
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>fix to issue 5 has been pulled together with issue 3.<br>besides the fix to the Encoding.GetEncoding itself, the change also contains several fixes to avoid race-condition in multithreading environment, and some performance improvements of I18N.<br>https://github.com/mono/mono/pull/1272/files<br>it will be good if anyone from mono team can help to accept the request.<br><br>     .Hzj_jie<br><br><div><hr id="stopSpelling">From: hzj_jie@hotmail.com<br>To: marek.safar@gmail.com<br>Date: Tue, 16 Sep 2014 15:42:55 +0000<br>CC: mono-devel-list@lists.ximian.com<br>Subject: Re: [Mono-dev] a set of tests to find out the difference between .Net and Mono implementation<br><br>



<style data-externalstyle="true">
.ExternalClass p.ecxMsoListParagraph, .ExternalClass li.ecxMsoListParagraph, .ExternalClass div.ecxMsoListParagraph {
}

.ExternalClass p.ecxMsoNormal, .ExternalClass li.ecxMsoNormal, .ExternalClass div.ecxMsoNormal {
}

.ExternalClass p.ecxMsoListParagraphCxSpFirst, .ExternalClass li.ecxMsoListParagraphCxSpFirst, .ExternalClass div.ecxMsoListParagraphCxSpFirst, .ExternalClass p.ecxMsoListParagraphCxSpMiddle, .ExternalClass li.ecxMsoListParagraphCxSpMiddle, .ExternalClass div.ecxMsoListParagraphCxSpMiddle, .ExternalClass p.ecxMsoListParagraphCxSpLast, .ExternalClass li.ecxMsoListParagraphCxSpLast, .ExternalClass div.ecxMsoListParagraphCxSpLast {
line-height:115%;
}

</style>

<div data-externalstyle="false" dir="ltr" style="font-family:'Calibri', 'Microsoft YaHei UI', 'Segoe UI', 'Meiryo', 'Microsoft JhengHei UI', 'Malgun Gothic', 'sans-serif';font-size:12pt;"><div>Thank you Marek,</div><div style="color:rgb(0, 0, 0);font-family:"Color Emoji", "Calibri", "Microsoft YaHei UI", "Segoe UI", "Meiryo", "Microsoft JhengHei UI", "Malgun Gothic", "sans-serif";font-size:16px;">1. GC</div><div style="color:rgb(0, 0, 0);font-family:"Color Emoji", "Calibri", "Microsoft YaHei UI", "Segoe UI", "Meiryo", "Microsoft JhengHei UI", "Malgun Gothic", "sans-serif";font-size:16px;">It's do tricky, briefly WeakReference an object, and call GC.Collect() and GC.WaitForPendingFinalizers() for several times < 3 in my case >, in .Net, the WeakReference will be invalid. in Mono, I did not see the same behavior. I agree your point, there should be no guarantee. Besides a more reliable test case, I will also consider to look deeply later.</div><div style="color:rgb(0, 0, 0);font-family:"Color Emoji", "Calibri", "Microsoft YaHei UI", "Segoe UI", "Meiryo", "Microsoft JhengHei UI", "Malgun Gothic", "sans-serif";font-size:16px;">p.s. there is a weak_pointer_test in the test cases I have provided, which does exactly the way above. In .Net implementation, I have not seen it failed ever. In Mono, it fails consistently.</div><div style="color:rgb(0, 0, 0);font-family:"Color Emoji", "Calibri", "Microsoft YaHei UI", "Segoe UI", "Meiryo", "Microsoft JhengHei UI", "Malgun Gothic", "sans-serif";font-size:16px;">2. char.GetHashCode()</div><div style="color:rgb(0, 0, 0);font-family:"Color Emoji", "Calibri", "Microsoft YaHei UI", "Segoe UI", "Meiryo", "Microsoft JhengHei UI", "Malgun Gothic", "sans-serif";font-size:16px;">I am not relying on the exact result, but just raise following two issues based on currently implementation. A), the range of char.GetHashCode() is [0, 65536), instead of [-2147483648, 2147483648). It's true we have only 65536 characters for char. B), the difference of hash codes between two adjacent characters is not significant. < sorry for the typo in last mail >. so the issue more likes, the implementation of hash algorithm for char is not random enough, and may cause race-conditions if we are using the char hash algorithm for hash-table based containers.</div><div style="color:rgb(0, 0, 0);font-family:"Color Emoji", "Calibri", "Microsoft YaHei UI", "Segoe UI", "Meiryo", "Microsoft JhengHei UI", "Malgun Gothic", "sans-serif";font-size:16px;">3. The pull request was done by me, glad to see it may be accepted later.</div><div style="color:rgb(0, 0, 0);font-family:"Color Emoji", "Calibri", "Microsoft YaHei UI", "Segoe UI", "Meiryo", "Microsoft JhengHei UI", "Malgun Gothic", "sans-serif";font-size:16px;">For 4 5 and 6, I will try to fix before just reporting bugs.</div><div data-signatureblock="true"><br></div><div data-signatureblock="true">.Hzj_jie</div><div data-signatureblock="true"><br></div><div style="padding-top:5px;border-top-color:rgb(229, 229, 229);border-top-width:1px;border-top-style:solid;"><div><font style="line-height:15pt;letter-spacing:0.02em;font-family:"Calibri", "Microsoft YaHei UI", "Segoe UI", "Meiryo", "Microsoft JhengHei UI", "Malgun Gothic", "sans-serif";font-size:12pt;" face=" 'Calibri', 'Microsoft YaHei UI', 'Segoe UI', 'Meiryo', 'Microsoft JhengHei UI', 'Malgun Gothic', 'sans-serif'"><b>From:</b> <a href="mailto:marek.safar@gmail.com">Marek Safar</a><br><b>Sent:</b> ‎Tuesday‎, ‎September‎ ‎16‎, ‎2014 ‎7‎:‎31‎ ‎PM<br><b>To:</b> <a href="mailto:hzj_jie@hotmail.com">何子杰</a><br><b>Cc:</b> <a href="mailto:mono-devel-list@lists.ximian.com">Mono Develop Mailing List</a></font></div></div><div><br></div><div dir=""><div dir="ltr">Hi,<div><div class="ecxgmail_extra"><div class="ecxgmail_quote"><blockquote class="ecxgmail_quote" style="padding-left:1ex;border-left-color:rgb(204, 204, 204);border-left-width:1px;border-left-style:solid;"><div><div dir="ltr"><div><br></div><div><br></div><div><span style="font-size:12pt;">i tried it myself, and find out several issues, which are mainly against Mono 3.10 from development tree.</span></div></div></div></blockquote><div><br></div><div>Thanks for the analysis more comments inline. <br></div><div> <br></div><blockquote class="ecxgmail_quote" style="padding-left:1ex;border-left-color:rgb(204, 204, 204);border-left-width:1px;border-left-style:solid;"><div><div dir="ltr"><div>1. GC</div><div>thought GC.Collect() does not guarantee all the inaccessible objects are finalized and reclaimed, .Net implementation usually be able to delete all the inaccessible objects.</div><div>impacts, delegate_pinning_test, it make sure the delegate / event in .net will release the object after itself has been released.</div><div>weak_pointer_test, weak_pointer is a simple wrapper of WeakReference, which is strong-typed.</div><div>event_disposer_test, event_disposer is a strong-typed pointer, which provide disposing event when disposing.</div><div>lifetime_binder_test, lifetime_binder is a collection to avoid the object to be finalized.</div></div></div></blockquote><div><br></div><div>Strictly speaking if something is not guaranteed then even Mono cannot guarantee it. GC is tricky and we have some holes in our WeakReference implementation and it'd be helpful if you can provide reliable test case.</div><div> </div><blockquote class="ecxgmail_quote" style="padding-left:1ex;border-left-color:rgb(204, 204, 204);border-left-width:1px;border-left-style:solid;"><div><div dir="ltr"><div>2. char.GetHashCode()</div><div>the implementation of simhash / himming_distance uses char.GetHashCode(), according to Mono implementation, this function returns char as int, and cause the similarity of two adjusted characters to be small. while .Net implementation seems having some magic. the impact is hamming_distance of "ABC" and "DEF" is 1, instead of a number in range [0, 1).</div><div>impacts, simhash_test</div></div></div></blockquote><div><br></div><div><div>This is just different implementation detail. You should not rely on exact GetHashCode result.</div></div><div> </div><blockquote class="ecxgmail_quote" style="padding-left:1ex;border-left-color:rgb(204, 204, 204);border-left-width:1px;border-left-style:solid;"><div><div dir="ltr"><div>3. System.Threading.Thread.Priority is not implemented</div><div>impacts thread_timing_test, thread_timing is an IDisposable to temporarily adjust thread priority.</div></div></div></blockquote><div><br></div><div>There is a pull request for this in the queue but it hasn't been merged yet.</div><div> </div><blockquote class="ecxgmail_quote" style="padding-left:1ex;border-left-color:rgb(204, 204, 204);border-left-width:1px;border-left-style:solid;"><div><div dir="ltr"><div>4. Environment.TickCount() is not consistent with DateTime.Now</div><div>i.e. DateTime.Now increased 1000 milliseconds, Environment.TickCount() increased only 950 milliseconds. though the definition of Environment.TickCount() and DateTime.Now do not guarantee they are the same, .Net implementation does not have such large difference.</div><div>impacts, event_comb_waitfor_test, the difference itself is not consistent, so the failures may not happen always.</div></div></div></blockquote><div><br></div><div>This could be consider as minor bug, please fill bug report with repro.</div><div> </div><blockquote class="ecxgmail_quote" style="padding-left:1ex;border-left-color:rgb(204, 204, 204);border-left-width:1px;border-left-style:solid;"><div><div dir="ltr"><div>5. Encoding.GetEncoding(string) may not be able to return correct Encoding instance, even the EncodingInfo is from Encoding.GetEncodings()</div><div>impacts, web_extension_test, according to msdn, the Encoding.GetEncoding(EncodingInfo.WebName) should always return a valid Encoding instance.</div></div></div></blockquote><div><br></div><div>Sound like a bug to me. Could you fill bug report with repro for this.</div><div> </div><blockquote class="ecxgmail_quote" style="padding-left:1ex;border-left-color:rgb(204, 204, 204);border-left-width:1px;border-left-style:solid;"><div><div dir="ltr"><div>6. Process.Start does not be able to execute the binary if it does not have execute permission</div></div></div></blockquote><blockquote class="ecxgmail_quote" style="padding-left:1ex;border-left-color:rgb(204, 204, 204);border-left-width:1px;border-left-style:solid;"><div><div dir="ltr"><div>in Windows platform, the file by default has execute permission, while in Linux, it's not. i do not think this is a Mono issue, but will it be better to help set the execute permission if Process.Start calls a non-executable file? or at least provide a more friendly exception, current the error message is 'Cannot find the specified file', which is confusing.</div></div></div></blockquote><div><br></div><div>We cannot just set the execution permission but reporting more useful exception is good idea. Could you fill bug/enhancement report for this.</div><div> </div><blockquote class="ecxgmail_quote" style="padding-left:1ex;border-left-color:rgb(204, 204, 204);border-left-width:1px;border-left-style:solid;"><div><div dir="ltr"><div><br></div><div>there are several other issues related to the Thread.ManagedThreadId(), or thread scheduling, <which may more depend on OS>, and cause the cases not be able to run. i am continually working on them. hope i can find out more differences later.</div></div></div></blockquote><div><br></div><div>Thanks</div><div>Marek</div></div></div></div></div>
</div></div>


<br>_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list</div>                                      </div></body>
</html>