parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Проверка с использованием .NET

egr 27.05.2005 07:53

Значится так, - я проверил это в .NET. Эксперимент ставил чистый, т.е. проверял однократный поиск в тексте размером 500K.

На моей тачке результаты такие:
D:\CSharp\RegexpText\bin\Debug>RegexpText.exe microserfs.txt Modernist
String result is: True. Time in milliseconds taken: 8,73770269685114
Regexp result is: True. Time in milliseconds taken: 1,45968272503908
Вот иходник теста:
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using Beeline.MOM;

namespace RegexpText
{
	/// <summary>
	/// Summary description for Class1.
	/// </summary>
	class Class1
	{
		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[MTAThread]
		static void Main(string[] args)
		{
			if (args.Length != 2)
			{
				Console.WriteLine("Usage is RegexpText.exe <file> <pattern>");
				return;
			}
			ElapsedTimeMilliseconds timer = new ElapsedTimeMilliseconds();
			string text = GetTestText(args[0]);

			if (text == null)
			{
				Console.WriteLine("File not found or empty");
				return;
			}
			// String functions
			timer.Begin();
			bool found = (text.IndexOf(args[1]) >= 0);
			timer.End();
			Console.WriteLine("String result is: {0}. Time in milliseconds taken: {1}", found, timer.Elapsed);

			// Regexp
			Regex regex = new Regex(args[1], RegexOptions.None);
			timer.Begin();
			found = regex.IsMatch(text);
			timer.End();
			Console.WriteLine("Regexp result is: {0}. Time in milliseconds taken: {1}", found, timer.Elapsed);
		}

		static string GetTestText(string file)
		{
			StreamReader r = null;
			string result = null;
			try
			{
				r = new StreamReader(file, Encoding.ASCII);
				result = r.ReadToEnd();
			}
			catch(ArgumentException e)
			{
				Trace.WriteLine(e.ToString());
			}
			catch(FileNotFoundException e)
			{
				Trace.WriteLine(e.ToString());
			}
			catch(DirectoryNotFoundException e)
			{
				Trace.WriteLine(e.ToString());
			}
			catch(IOException e)
			{
				Trace.WriteLine(e.ToString());
			}
			catch(OutOfMemoryException e)
			{
				Trace.WriteLine(e.ToString());
			}
			finally
			{
				if (r != null)
				{
					r.Close();
				}
			}
			return result;
		}
	}
}
Пусть не пугает использование Beeline.MOM - это я просто взял из своего текущего проекта библиотечку (сам написал) в которой есть классы-обертки для замера времени использующие Win32 API.

Желающие могут загрузить собраный код с тестовым файлом:

http://www.egoroff.spb.ru/download/RegexpText.zip

и проверить это у себя.