Skip to content

Natasha 预热优化 #69

@NMSAzulX

Description

@NMSAzulX

我原本是使用NatashaInitializer.Initialize();
使用是正常的,但是我每次调用构建都要2秒的时间,感觉太费时间了。
所以就想到了InitializeAndPreheating();,可是我调用这个就报错。

Natasha版本:3.1.0.0
测试代码和错误信息如下:

测试代码:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using Natasha.CSharp;
using System.Threading.Tasks;

namespace MyNameSpace
{
    [TestClass()]
    public class MyClassTest
    {
        [TestMethod()]
        public void Natasha_测试()
        {
            //仅仅注册组件 这个初始化是可以正常使用的,就是每次都要2秒左右,很耗费时间。
            NatashaInitializer.Initialize();
            for (int i = 0; i < 10; i++)
            {
                var start = DateTime.Now;
                Natasha测试一次();
                Console.WriteLine($"第{i}次查询用时:{(DateTime.Now - start).TotalSeconds}秒");
            }
        }
        [TestMethod()]
        public async Task Natasha_测试Async()
        {
            //注册+预热组件 , 之后编译会更加快速 可是这个调用报错了,想知道我应该怎么做
            await NatashaInitializer.InitializeAndPreheating();
            for (int i = 0; i < 10; i++)
            {
                var start = DateTime.Now;
                Natasha测试一次();
                Console.WriteLine($"第{i}次查询用时:{(DateTime.Now - start).TotalSeconds}秒");
            }
        }
        private void Natasha测试一次()
        {
            var newClassName = $"{nameof(BaseModel)}_{new Random().Next(int.MaxValue)}";
            var action = FastMethodOperator.DefaultDomain(option =>
            {
                option.Add($@"
                namespace MyNameSpace
                {{
                    public class {newClassName} : {nameof(BaseModel)}
                    {{
                        public override string Name => ""OveName"";
                    }}
                }}");
            })
            .Param(typeof(string), "inValue")
            .Body($@"
                var obj = new {newClassName}();
                return obj.Show(inValue);
                ")
            .Return<string>()
            .Compile<Func<string, string>>();
            var result = action("aaabbb");
            Console.WriteLine($"result:{result}");
        }
    }
    public class BaseModel
    {
        public virtual string Name => "BaseName";
        public string Show(string inValue)
        {
            Console.WriteLine($"ClassName:{this.GetType().Name},Name:{Name},InValue:{inValue}");
            return $"Result {inValue}";
        }
    }
}

错误信息:

 Natasha_测试Async
   源: ZzwTest.cs 行 24
   持续时间: 2.1 秒

  消息: 
    Test method MyNameSpace.MyClassTest.Natasha_测试Async threw exception: 
    Natasha.Error.NatashaException: 编译错误 : CS8021 找不到 RuntimeMetadataVersion 的值。找不到包含 System.Object 的程序集,或未通过选项为 RuntimeMetadataVersion 指定值。
  堆栈跟踪: 
    AssemblyCSharpBuilder.GetAssembly()
    AssemblyBuilderExtension.GetTypeFromShortName(AssemblyCSharpBuilder builder, String typeName)
    AssemblyBuilderExtension.GetMethodFromShortName(AssemblyCSharpBuilder builder, String typeName, String methodName)
    AssemblyBuilderExtension.GetDelegateFromShortName(AssemblyCSharpBuilder builder, String typeName, String methodName, Type delegateType, Object target)
    AssemblyBuilderExtension.GetDelegateFromShortName[T](AssemblyCSharpBuilder builder, String typeName, String methodName, Object target)
    MethodBuilder`1.Compile[S](Object target)
    DelegateOperator`1.Delegate(String content, AssemblyCSharpBuilder builder, Action`1 option, Func`2 methodAction, Func`2 oopAction, NamespaceConverter[] usings)
    NDelegate.Action(String content)
    NatashaInitializer.InitializeAndPreheating(Boolean initializeReference)
    MyClassTest.Natasha_测试Async() 行 27
    ThreadOperations.ExecuteWithAbortSafety(Action action)

Originally posted by @zhangzw218 in #68

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions