显然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中的字符串处理相关推荐

  1. asp.net core轻松入门之MVC中Options读取配置文件

    接上一篇中讲到利用Bind方法读取配置文件 ASP.NET Core轻松入门Bind读取配置文件到C#实例 那么在这篇文章中,我将在上一篇文章的基础上,利用Options方法读取配置文件 首先注册MV ...

  2. NET问答: 如何在 ASP.NET Core Web API 的 Response 中添加自定义的 Header ?

    咨询区 JDawg: 我正在将 Web API 2 移植到 ASP.NET Core Web API 上,以前我都直接在 Response 属性上添加自定义的 Header,如下代码所示: HttpR ...

  3. ASP.NET Core在Azure Kubernetes Service中的部署和管理

    目标 部署:掌握将aspnetcore程序成功发布到Azure Kubernetes Service(AKS)上 管理:掌握将AKS上的aspnetcore程序扩容.更新版本 准备工作 注册 Azur ...

  4. 【Asp.net Core】在 Linux 子系统中安装 nginx 并配置反向代理

    上一篇鸟文中,老周已经介绍过在 Ubuntu 子系统中安装 dotnet-sdk 的方法,本文老周给大伙伴们说说安装 nginx 服务,并配置反向代理.同样,老周假设你从来没有用过 Linux,所以老 ...

  5. Entity Framework中的字符串插值引发担忧

    将内插字符串(Interpolated Strings)自动地转化为参数化SQL语句,这是Entity Framework Core 2提供的一个新特性.虽然该特性从设计上是为了避免出现SQL语句编写 ...

  6. (译)利用ASP.NET加密和解密Web.config中连接字符串

    介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Server, A ...

  7. ASP.NET Core Api网关Ocelot的中文文档

    架构图 入门 不支持 配置 路由 请求聚合 GraphQL 服务发现 微服务ServiceFabric 认证 授权 Websockets 管理 流量控制 缓存 QoS服务质量 转换Headers 转换 ...

  8. .NET 6 Preview 3 中 ASP.NET Core 的更新和改进

    原文:bit.ly/2Qb56NP 作者:Daniel Roth 译者:精致码农-王亮 .NET 6 预览版 3 现已推出,其中包括许多对新的 ASP.NET Core 改进.以下是本次预览版的新内容 ...

  9. .ASP NET Core中缓存问题案例

    本篇博客中,我将描述一个关于会话状态(Session State)的问题, 这个问题我已经被询问了好几次了. 问题的场景 创建一个新的ASP.NET Core应用程序 一个用户在会话状态中设置了一个字 ...

最新文章

  1. 说说“开源杀死商业开发工具”
  2. “约见”面试官系列之常见面试题第四十四篇之webpack打包原理解析?(建议收藏)
  3. linux网络编程中需要注意的信号SIGPIPE
  4. loadlin.exe
  5. 8.Linux性能诊断 --- 浅谈基于数据分析的网络态势感知
  6. ArcGIS发布地图服务--ArcMap
  7. mysql提示表不存在的解决方法error: 1146: Table doesn‘t exist
  8. 淘宝原数据商品详情API调用示例
  9. 苹果闪退解决方法_《天涯明月刀手游》无限闪退问题解决方法 闪退是什么问题...
  10. 荣耀30sr升级鸿蒙,华为荣耀30怎么升级鸿蒙系统?
  11. 阿里云服务器被攻击了
  12. 联通与阿里云、腾讯云合作 引发“云震荡”
  13. 小程序源码:全新独立后台修复登录在线答题-多玩法安装简单
  14. 无线传感器实验-低功率无线信道建模
  15. STM32 FreeRTOS (三) 软件定时器
  16. 太空飞行计划LibreOJ - 6001(网络流24题)(最大权闭合图)
  17. action='store_true'
  18. 关于温度气压传感器MS5611计算公式—温度低于20℃时出错问题的解决办法及验证结果
  19. 使用Java+OpenCV3制作,用于生成萌萌哒的GitHub默认头像
  20. Django框架与html页面之间如何实现数据的交互,专属菜鸟的教程

热门文章

  1. SD卡读写扇区注意事项(转)
  2. 判断文件是否存在一个API函数
  3. 空谈Saas都扯淡,让你看看真正的云计算
  4. 钱德沛教授:云计算和网格计算差别何在?
  5. 路遥工具箱全面迁移至 .NET 6.0 并发布 3.0 版本及迁移记录详解
  6. .NET 6新特性试用 | 总结:我最喜欢的5个特性
  7. 如何高效的比较两个 Object 对象是否相等?
  8. GitHub 的 Action 接入 Stryker.NET 进行自动化测试单元测试鲁棒性
  9. WPF 模仿QQ音乐首页歌单效果
  10. 快速弄懂陌生领域是一项“赚钱”的能力