помогите произвести и оптимизировать вычисление в динамическ
От: sanyur  
Дата: 28.09.10 10:15
Оценка:
Здравствуйте. помогите повысить быстродействие кода:
        static double computer(string expression, string x) 
        {
            // компилятор кода C#
            ICodeCompiler cs = (new CSharpCodeProvider().CreateCompiler());
            // параметры компиляции: DLL в памяти
            CompilerParameters cp = new CompilerParameters();
            cp.ReferencedAssemblies.Add("system.dll");
            cp.GenerateExecutable = false; // создать DLL
            cp.GenerateInMemory = true;  // создать в памяти
 
            // текст программы на C#:
            string code = string.Empty;
            code += "using System;\r\n ";
            code += "namespace CSEvaluator\r\n";
            code += "{ public class Evaluate\r\n";
            code += "  { public  double GetResult()\r\n{double x = " + x + ";\r\n";
            code += " return "+ expression +";\r\n }";
            code += "    private double exp(double x){ return(Math.Exp(x)); }";
            code += "    private double log(double x){ return(Math.Log(x)); }";
            code += "    private double log(double x,double s){ return(Math.Log(x,s)); }";
            code += "    private double pow(double x, double y){ return(Math.Pow(x,y)); }";
            code += "    private double sin(double x){ return(Math.Sin(x)); }";
            code += "    private double cos(double x){ return(Math.Cos(x)); }";
            code += "    private double pi(){ return(Math.PI); }";
            code += "  }\r\n";
            code += "}";
            text += code;
 
            // компиляция исходного кода и получение сборки
            CompilerResults cr = cs.CompileAssemblyFromSource(cp, code);
            if (cr.Errors != null && cr.Errors.Count > 0) // ? ошибки 
            {
                for (int i = 0; i < cr.Errors.Count; i++)
                    text += "Col {0} - {1}" + cr.Errors[i].Column + cr.Errors[i].ErrorText;
                return -6666;
            }
 
            try // создать объект и вызвать метод для вычисления выражения
            {
                object ob = cr.CompiledAssembly.CreateInstance("CSEvaluator.Evaluate");
                return ((double)ob.GetType().InvokeMember("GetResult", BindingFlags.InvokeMethod, null, ob, new object[] { }));
            }
            catch (Exception ex) { text += ex.Message; return (0); }
        }

Необходимо произвести вычисления минимизации функции. так что данная функция вызывается много раз(например, при методе дихотомии 10 итераций, вызывается 20 раз), а вычисляется минимум функции за 12 секунд. можно ли сократить?

подскажите какая часть кода более трудоемкая.

можно ли создать dll глобально а потом вычислять getresult с параметром string x, передаваемой из texbox и намного ли быстрей будет в таком случае?

28.09.10 18:41: Перенесено модератором из 'Алгоритмы'. Добавил разметку и убрал двойной интервал. — Кодт
c# dll оптимизация кода
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.