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