我正在尝试Span<T>利用.NETCore 2.2来提高从文本文件解析文本的性能。文本文件包含多个连续的数据行,每行将被拆分为字段,然后每个字段都映射到一个数据类。
最初,解析例程使用传统方法StreamReader读取每一行,然后使用Substring从该行复制各个字段。
从我读过的内容(在 MSDN 上)来看,除其他外,Span<T>随着Slice数据分配的减少,使用with应该更有效地执行,相反,一个指向byte[]数组的指针被传递并执行。
经过一些实验,我比较了 3 种解析文件的方法,并使用 BenchmarkDotNet 来比较结果。我发现,当使用 解析文本文件中的单行时Span,平均执行时间和分配的内存确实显着减少。到现在为止还挺好。但是,当从文件中解析多于一行时,性能提升很快就会消失,几乎可以忽略不计,即使是从 50 行开始也是如此。
我确定我一定错过了一些东西。某些东西似乎超过了Span.
性能最佳的方法WithSpan_StringFirst如下所示:
private static byte[] _filecontent;
private const int ROWSIZE = 252;
private readonly Encoding _encoding = Encoding.ASCII;
public void WithSpan_StringFirst()
{
var buffer1 = new Span<byte>(_filecontent).Slice(0, RowCount * ROWSIZE);
var buffer = _encoding.GetString(buffer1).AsSpan();
int cursor = 0;
for (int i = 0; i …Run Code Online (Sandbox Code Playgroud) 我有一个ASP.NET Core 1.0类库,我最近成功升级到.NET Core 1.0 RTM.我用它来实现一些自定义的Json输入和输出格式化程序,以包含在ASP.NET Core管道中,因此引用Newtonsoft.Json 9.0.1包来处理JsonSerializerSettings对象之类的东西.该项目编译没有错误.
但是,我有一些运行时问题,我想通过逐步完成Newtonsoft源代码进一步调查.在.NET Core中,我已经习惯了通过简单地在global.json文件中添加对已检出源的引用来替换Nuget包引用及其源代码的灵活性(在本博文中很好地解释).这适用于来自github的Microsoft AspNetCore源文件,我经常使用它.
出于某种原因,我无法通过Newtonsoft源代码实现这一目标.我从github克隆了Newtonsoft源代码,并检查了我的项目引用的确切9.0.1标记.然后我在我的解决方案中将源位置添加到我的global.json文件中.在此之后,Visual Studio 2015立即找到Newtonsoft项目并成功将其解析为本地引用.我甚至可以在我的项目参考中看到,当它使用来自同一解决方案的项目而不是来自nuget服务器的dll时,Newtonsoft引用的图标已经改变了.另外,我没有看到任何警告或错误,有时您会发现引用无法正确解析.
但是,当我尝试编译项目时,我现在得到以下编译错误:
错误CS0012类型"JsonSerializer"在未引用的程序集中定义.您必须添加对程序集"Newtonsoft.Json,Version = 9.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed"的引用.
这个错误对我没有意义,因为项目引用在没有错误的情况下解决得很好,如果我删除源引用并让它从nuget获取编译版本,那么项目编译就可以了.这是我项目的project.json:
{
"version": "0.2.0",
"description": "...",
"authors": [ "..." ],
"buildOptions": {
"xmlDoc": true
},
"frameworks": {
"net451": { },
"netstandard1.6": {}
},
"dependencies": {
"Microsoft.AspNetCore.Mvc": "1.0.0",
"Microsoft.AspNetCore.Mvc.Formatters.Json": "1.0.0",
"Microsoft.Extensions.Logging.Abstractions": "1.0.0",
"Newtonsoft.Json": "9.0.1"
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我创建了一个 ASP.NET Core 1.0.1 WebApi 项目,并尝试在我的控制器中使用它之前使用一些自定义选项初始化注入的依赖项。在线搜索后,我发现了几篇文章(这里,这里和这里解释了如何使用 IConfigureServices 来做到这一点。看起来很简单!不幸的是,我无法让它工作,我不明白为什么,我当然这一定是一个简单的疏忽..
我创建了一个简单的项目,并添加了以下类来说明最基本的场景:
public class Tester
{
public void Initialize(TestOptions options)
{
//do something with options.
}
}
public class TestConfigurator : IConfigureOptions<TestOptions>
{
private Tester _tester;
public TestConfigurator(Tester tester)
{
_tester = tester;
}
public void Configure(TestOptions options)
{
_tester.Initialize(options);
}
}
public class TestOptions
{
}
Run Code Online (Sandbox Code Playgroud)
“Tester”类被注入到 Controller 类的构造函数中:
[Route("api/[controller]")]
public class ValuesController : Controller
{
public ValuesController(Tester tester)
{
//do something with tester..
}
// …Run Code Online (Sandbox Code Playgroud)