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" <[EMAIL PROTECTED]>
To: "Kornél Pál" <[EMAIL PROTECTED]>
Cc: <mono-devel-list@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

_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to