ASP.NET Core改进了.NET Framework中的字符串处理
显然Microsoft开发人员和管理人员并没有表达清楚,事实上ASP.NET Core 2.0将会得到整个.NET Framework的支持。当前的更改只实现了在ASP.NET上提供.NET Core,这是为了便于开发而采取的一个临时步骤。对此,在ASP.NET Core预览发行声明中给出了如下的解释:
在发布ASP.NET Core 2.0预览版时,仅提供了对.NET Core 2.0 SDK的支持。我们的目标是在.NET Standard 2.0中发布ASP.NET Core 2.0,使应用可运行在.NET Core、Mono和.NET Framework上。团队正致力于在Build大会之前解决最后一些问题,最突出的问题是在ASP.NET Core 2.0预览版中使用了.NET Standard 2.0之外的API,这妨碍了在.NET Framework上的运行。由于这些问题,我们限制了Preview 1版本对.NET Core的支持,以免对开发人员在.NET Framework上将ASP.NET Core 1.x应用升级到ASP.NET Core 2预览版时造成破坏。
在Register的一次采访中,Miguel de Icaza确认了Microsoft对.NET Framework的承诺:
我要对此做出澄清。我感到十分遗憾的是,即将推出的.NET Core 2.0是我们专为Build大会准备,它只是一个预览版,因为我们发现其中存在一系列在.NET Framework上无法很快得到解决的问题。因此,我们推出的软件包仅支持在.NET Core 2.0上运行ASP.NET Core 2.0。我们将会修复这个问题,.NET Core 2.0终将运行在.NET Framework上。
即便是临时性更改,一个依然需要解决的问题是:要想进一步改进ASP.NET的性能,需要提供更好的字符串处理库。
内存分配上的考虑
在.NET中,几乎所有的字符串处理方法都要做内存分配,该问题长期以来一直为人所诟病。在解析JSON、XML等格式时,substring
方法常会产生成百上千的微小字符串分配。这不仅耗费了大量时间生成拷贝,而且对垃圾回收造成了很大的压力。这并非应用开发人员所能掌控的。
这种做法有其合理性。与.NET一样,在Java中字符串也是不可变的。而Java自带的substring
方法并不分配新的字符串,它创建一个指向原始字符串的指针。虽然Java的substring
方法无需分配内存,但是存在着内存泄漏的风险。一个字符串substring
方法可以保留5MB字符串不被垃圾回收(这个问题相当恶劣,因此在Java 1.7u6版中做了更改,substring
方法做内存分配)。
在“Span<T>建议”中,开发人员可以选择使用两种不同的substring
方法,即分配内存的方法和不做内存分配的方法。ASP.NET Core所使用的解析库也可以被覆写,在内部使用不分配内存的substring
方法。但在解析操作的最后阶段,需要确保释放所有Span<char>的实例。
这一更改还需要重新实现更高效的基本类型解析方法,例如Int32.Parse和Inta32.TryParse等。理想情况下,这些方法将会加入到基类库(BCL,Base Class Library)中,而不是以单独库的方式提供。这就回到了.NET Framework、Standard和Core的对比问题上。
毫无疑问,可以加快对.NET Core的更改过程。除了操作系统特定的功能,新特性将做优先更改。否则,只有得到所有.NET/Mono的各种实体(incarnation)支持的新特性,才会出现在.NET Standard中。虽然从理论上讲,这些实体也归属于Microsoft的,但是新特性的添加依然会是一个冗长的过程。
因此,在开发ASP.NET Core的过程中,基于ASP.NET进行构建是合乎情理的。这使得新的API在提交标准化前,得到真实用例的精炼。
默认编码上的考虑
并非所有开发人员都了解,在.NET内部使用的是UTF16字符串。除了实现文件或网络I/O处理之外,对于大部分用例,开发人员都无需考虑编码问题。
Web应用主要基于UTF8编码。同样,在处理大部分用例时,服务器端开发人员也无需考虑编码问题。只需确保无论使用何种内部格式,最终都会转换为UTF8编码。
当需考虑性能时,这种做法就存在问题。所有的Web请求最初都是以UTF8编码的,需要在被.NET理解前转化为UTF16编码。反之,所有来自.NET服务器的响应,需要由UTF16编码转化为UTF8编码。
现在已有一些建议方法,意在消除这种转换的必要。一种做法创建了Utf8String类并匹配字符串处理库,之后就可以新建直接操作类的解析库。这一做法是完全“明确征得同意”(Opt In)的,因此风险很低。
更全面的建议是由Matt Warren提出的,称为“紧凑字符串(Compact String)实现”。该建议受到了OpenJDK中类似建议的启发,它会在字符串中添加一个类型字段,用于指示所使用的编码。这是一种更大程度上的更改,对Span<T>存在一些负面影响。
原文地址:http://www.infoq.com/cn/news/2017/05/ASPNET-Core-2b
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
ASP.NET Core改进了.NET Framework中的字符串处理相关推荐
- asp.net core轻松入门之MVC中Options读取配置文件
接上一篇中讲到利用Bind方法读取配置文件 ASP.NET Core轻松入门Bind读取配置文件到C#实例 那么在这篇文章中,我将在上一篇文章的基础上,利用Options方法读取配置文件 首先注册MV ...
- NET问答: 如何在 ASP.NET Core Web API 的 Response 中添加自定义的 Header ?
咨询区 JDawg: 我正在将 Web API 2 移植到 ASP.NET Core Web API 上,以前我都直接在 Response 属性上添加自定义的 Header,如下代码所示: HttpR ...
- ASP.NET Core在Azure Kubernetes Service中的部署和管理
目标 部署:掌握将aspnetcore程序成功发布到Azure Kubernetes Service(AKS)上 管理:掌握将AKS上的aspnetcore程序扩容.更新版本 准备工作 注册 Azur ...
- 【Asp.net Core】在 Linux 子系统中安装 nginx 并配置反向代理
上一篇鸟文中,老周已经介绍过在 Ubuntu 子系统中安装 dotnet-sdk 的方法,本文老周给大伙伴们说说安装 nginx 服务,并配置反向代理.同样,老周假设你从来没有用过 Linux,所以老 ...
- Entity Framework中的字符串插值引发担忧
将内插字符串(Interpolated Strings)自动地转化为参数化SQL语句,这是Entity Framework Core 2提供的一个新特性.虽然该特性从设计上是为了避免出现SQL语句编写 ...
- (译)利用ASP.NET加密和解密Web.config中连接字符串
介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Server, A ...
- ASP.NET Core Api网关Ocelot的中文文档
架构图 入门 不支持 配置 路由 请求聚合 GraphQL 服务发现 微服务ServiceFabric 认证 授权 Websockets 管理 流量控制 缓存 QoS服务质量 转换Headers 转换 ...
- .NET 6 Preview 3 中 ASP.NET Core 的更新和改进
原文:bit.ly/2Qb56NP 作者:Daniel Roth 译者:精致码农-王亮 .NET 6 预览版 3 现已推出,其中包括许多对新的 ASP.NET Core 改进.以下是本次预览版的新内容 ...
- .ASP NET Core中缓存问题案例
本篇博客中,我将描述一个关于会话状态(Session State)的问题, 这个问题我已经被询问了好几次了. 问题的场景 创建一个新的ASP.NET Core应用程序 一个用户在会话状态中设置了一个字 ...
最新文章
- 说说“开源杀死商业开发工具”
- “约见”面试官系列之常见面试题第四十四篇之webpack打包原理解析?(建议收藏)
- linux网络编程中需要注意的信号SIGPIPE
- loadlin.exe
- 8.Linux性能诊断 --- 浅谈基于数据分析的网络态势感知
- ArcGIS发布地图服务--ArcMap
- mysql提示表不存在的解决方法error: 1146: Table doesn‘t exist
- 淘宝原数据商品详情API调用示例
- 苹果闪退解决方法_《天涯明月刀手游》无限闪退问题解决方法 闪退是什么问题...
- 荣耀30sr升级鸿蒙,华为荣耀30怎么升级鸿蒙系统?
- 阿里云服务器被攻击了
- 联通与阿里云、腾讯云合作 引发“云震荡”
- 小程序源码:全新独立后台修复登录在线答题-多玩法安装简单
- 无线传感器实验-低功率无线信道建模
- STM32 FreeRTOS (三) 软件定时器
- 太空飞行计划LibreOJ - 6001(网络流24题)(最大权闭合图)
- action='store_true'
- 关于温度气压传感器MS5611计算公式—温度低于20℃时出错问题的解决办法及验证结果
- 使用Java+OpenCV3制作,用于生成萌萌哒的GitHub默认头像
- Django框架与html页面之间如何实现数据的交互,专属菜鸟的教程
热门文章
- SD卡读写扇区注意事项(转)
- 判断文件是否存在一个API函数
- 空谈Saas都扯淡,让你看看真正的云计算
- 钱德沛教授:云计算和网格计算差别何在?
- 路遥工具箱全面迁移至 .NET 6.0 并发布 3.0 版本及迁移记录详解
- .NET 6新特性试用 | 总结:我最喜欢的5个特性
- 如何高效的比较两个 Object 对象是否相等?
- GitHub 的 Action 接入 Stryker.NET 进行自动化测试单元测试鲁棒性
- WPF 模仿QQ音乐首页歌单效果
- 快速弄懂陌生领域是一项“赚钱”的能力