[Mono-dev] [PATCH] Add GetString to UnicodeEncoding 2.0 andmodifysome Encoding wrappers

Kornél Pál kornelpal at gmail.com
Tue Apr 11 18:35:44 EDT 2006


Hi,

Numbers are things that can convince me.:)

Now I have three questions:
- Are there parts of the patch that are OK to commit?
- Do we care about class signature (what methods are overriden)?
- Do we care about the implementation of virtual methods (what methods do 
they call)?

I can follow any guidelines - altough I don't belive in performance above 
everything else - but I would like to know them otherwise I cannot follow 
them.

Kornél

----- Original Message ----- 
From: "Atsushi Eno" <atsushi at ximian.com>
To: "Kornél Pál" <kornelpal at gmail.com>
Cc: <mono-devel-list at lists.ximian.com>
Sent: Tuesday, April 11, 2006 6:56 PM
Subject: Re: [Mono-dev] [PATCH] Add GetString to UnicodeEncoding 2.0 
andmodifysome Encoding wrappers


> Hi,
>
> I'm not interested in how your patch accomplishes MS.NET compatibility.
> My question is simple: is your patch *good* for Mono?
>
> using System;
> using System.Diagnostics;
> using System.IO;
> using System.Text;
>
> public class Test
> {
>         public static void Main (string [] args)
>         {
>                 int loop = args.Length > 1 ? int.Parse (args [1]) : 100;
>                 string s = File.OpenText (args [0]).ReadToEnd ();
>                 Encoding e = Encoding.Unicode;
>                 Stopwatch sw = Stopwatch.StartNew ();
>                 for (int i = 0; i < loop; i++)
>                         e.GetBytes (s);
>                 sw.Stop ();
>                 Console.WriteLine (sw.ElapsedMilliseconds);
>         }
> }
>
> Before your patch:
> mono ./unicode.exe ../../svn/mono/web/web/masterinfos/System.Web.xml
> 5038
>
> After the patch:
> $ rundev2 mono ./unicode.exe 
> ../../svn/mono/web/web/masterinfos/System.Web.xml
> 10175
>
> Atsushi Eno
>
> Kornél Pál wrote:
>> Hi,
>>
>> I had some time and looked at all the encoding classes in I18N and in 
>> System.Text.
>>
>> byte* and char* is only used in UnicodeEncoding and GetByteCount and 
>> GetBytes in I18N.
>>
>> This means that having the #if NET_2_0 codes that you don't want to 
>> remove will cause performance loss on profile 2.0 in System.Text while 
>> will not improve performance in profile 1.1 as no such optimization is 
>> done.
>>
>> The solution is to use arrays in Encoding that improves simple, old 
>> fashioned encoding classes but override these methods to use pointers in 
>> classes that implement their core functionality using unsafe code.
>>
>> Encodings in System.Text (except UnicodeEncoding) use arrays and I think 
>> custom encodings created by users are array based as well so it results 
>> in better performance if we use arrays in Encoding. If custom encodings 
>> are using unsafe code they will have to override other methods because of 
>> MS.NET anyway to get the performance improvement.
>>
>> By overriding GetByteCount (string) and GetBytes (string) in MonoEncoding 
>> performance improvement on unsafe code will be preserved in addition it 
>> will be available in all profiles.
>>
>> MonoEncoding was already good so I just added these two methods and added 
>> the following code to GetBytes methods:
>>
>> int byteCount = bytes.Length - byteIndex;
>> if (bytes.Length == 0)
>> bytes = new byte [1];
>>
>> Some check is required because &bytes[0] will fail for zero-size arrays. 
>> "bytes.Length == byteIndex" could avoid this (but was present in only one 
>> of the methods) but this would prevent ArgumentException being thrown for 
>> too small output buffers. Creating a small array is little overhead and 
>> an exception will probably be thrown because charCount is non-zero.
>>
>> Attached an improved patch. Please review the patch.
>>
>> Kornél 




More information about the Mono-devel-list mailing list