Bing.com在.NET Core 2.1上运行!

简介: Bing.com在.NET Core 2.1上运行! 相关知识请参考.netCore开发团队博客(https://blogs.msdn.microsoft.com/dotnet/) Bing.com是一种云服务,运行在遍布全球许多数据中心的数千台服务器上。
Bing.com在.NET Core 2.1上运行!

 

相关知识请参考.netCore开发团队博客(https://blogs.msdn.microsoft.com/dotnet/) 


Bing.com是一种云服务,运行在遍布全球许多数据中心的数千台服务器上。Bing服务器每秒处理来自全球消费者的数千个用户查询,通过他们的浏览器,使用 Microsoft认知服务API的 合作伙伴以及个人数字助理Cortana进行搜索。我们的用户要求这些结果具有相关性和速度,因此性能和可靠性是运行Bing等成功云服务的关键组件。
Bing的前端堆栈主要是以MVC模式分层的托管代码编写的。大多数业务逻辑代码都是用C#编写的数据模型,视图逻辑是用 Razor 编写的。该层负责将搜索结果数据(编码为 Microsoft Bond )转换为HTML,然后将其压缩并发送到浏览器。作为Bing的前端平台的守门人,我们将开发人员的工作效率和功能敏捷性视为我们成功定义中的附加关键组件。数以百计的开发人员依靠这个平台将他们的功能投入生产,他们希望它能像钟表一样运行。
从一开始,Bing.com就在.NET Framework上运行,但它最近已转换为在.NET Core上运行。推动Bing.com采用.NET Core的主要原因是性能(即服务延迟),支持并行和应用程序本地安装,与机器范围的安装(或缺少安装)和 ReadyToRun映像无关 。为了实现这些改进,我们开始努力使代码在.NET实现中可移植,而不是依赖于仅在Windows上可用且仅与.NET Framework一起使用的库。团队开始使用.NET Standard 1.x,但是减少的API表面为我们的代码迁移带来了非常重要的复杂性。使用 .NET Standard 2.0 返回的20,000多个API,一切都改变了,我们能够迅速从代码修改转移到测试。在压缩了一些bug后,我们准备将.NET Core部署到生产环境中。
ReadyToRun图像
托管应用程序通常可能具有较差的启动性能,因为首先必须将JIT编译为机器代码。.NET Framework具有预编译技术 NGEN 。但是, NGEN 需要在将执行代码的计算机上执行预编译步骤。对于Bing来说,这意味着 NGENing 成千上万的机器。随着应用程序在Web服务机器上进行预编译,这与积极的部署周期相结合将导致显着的服务容量减少。此外,运行 NGEN 需要管理权限,这些权限在数据中心设置中通常不可用或经过严格审查。在.NET Core上, crossgen 工具允许将代码预编译为预部署步骤,例如在构建实验室中,并且部署到生产的映像已准备好运行!
性能
.NET Core 2.1几乎在运行时和库的所有领域都进行了重大的性能改进; 博客 上一篇文章中提供了一篇很好的论文。
我们的生产数据与.NET Core 2.1中的显着性能改进(与.NET Core 2.0和.NET Framework 4.7.2相比)产生了共鸣。下图跟踪了过去几个月内部服务器的延迟情况。Y轴是延迟(省略实际值),最后的急剧下降(6月2日)是.NET Core 2.1的部署!这一切都 提高 34% ,这要归功于.NET社区的辛勤工作!
.NET Core 2.1中的以下更改是我们工作负载的显着改进的亮点。它们以降低的影响顺序呈现。
  1. 矢量化string.Equals(@jkotas)和string.IndexOf/LastIndexOf(@eerhardt)
无论您采用哪种方式切片,HTML渲染和操作都是字符串繁重的工作负载。字符串比较和索引操作是其中的主要组成部分。这些操作的矢量化是我们测量的性能改进的最大贡献者。
  1. EqualityComparer<T>.Default(@AndyAyersMS)的虚拟化支持
我们的主要软件组件之一是重度用户 Dictionary<int/long, V> ,间接受益于JIT中为了 Dictionary<K, V>优化 而进行的内在识别工作(@benaadams)
  1. 软件写入监视并发GC(@ Maoni0和@kouvel)
这导致我们的应用程序中CPU使用率降低。在.NET Core 2.1之前,Windows x64(以及.NET Framework)上的写入监视是使用具有不同性能权衡的Windows API实现的。这个新实现依赖于JIT写屏障,它直观地增加了参考商店的成本,但是这个成本是摊销的,而且在我们的工作量中没有注意到。此改进现在也可以通过 2018年5月的安全性和质量汇总 在.NET Framework上获得
  1. 使用calli的方法现在可以内联(@AndyAyersMS和@mjsabby)
我们在代码的性能关键部分中使用 ldftn + calli 代替委托(这会产生对象分配),其中需要间接调用托管方法。此更改允许具有 calli 指令的方法体具有内联条件。我们的依赖注入框架生成这样的方法
  1. 提高string.IndexOfAny的2&3 char搜索性能(@bbowyersmyth)
前端堆栈中的常见操作是在字符串中搜索“:”,“/”,“/”以分隔URL的各个部分。这种特殊的外壳改进在整个代码库中都是有益的。
除了运行时更改之外,.NET Core 2.1还为.NET库生态系统带来了 Brotli 支持。Bing.com使用此功能动态压缩内容并将其提供给支持的浏览器。
运行时敏捷
最后,在我们的应用程序中拥有运行时的xcopy版本的能力意味着我们能够以更快的速度采用更新版本的运行时。事实上,如果您查看上面的图表,我们将在6月2日(即发布后的 两天) 的常规应用程序部署中全球范围内进行.NET Core 2.1更新!
这是可能的,因为我们在.NET Core的每日CI构建测试功能和性能的整个版本中运行我们的持续集成(CI)管道。
我们对未来感到兴奋,并与.NET团队密切合作,帮助他们确定未来的更新资格!.NET Core团队很兴奋,因为我们提供了大量的功能测试和额外的大型代码库来衡量实际的性能改进,以及我们致力于为Bing.com用户提供快速结果以及我们自己的开发人员使用最新的软件和工具。

本篇文章原址:Bing.com runs on .NET Core 2.1!

相关文章
|
25天前
|
C#
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
|
2月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
18天前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
30 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
8天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
18 3
|
18天前
|
前端开发 Android开发
WinForm 直接运行 Admin.NET
本文介绍了如何将 Admin.NET 以 WinForm 桌面程序模式运行,简化了手动配置 Web 服务的过程,便于演示和作为单机软件使用。通过添加特定 NuGet 包、修改 `Program.cs` 和 `Form1.cs` 文件,并调整项目配置,最终实现了在 WinForm 中嵌入 WebView 组件显示 Admin.NET 界面的效果。
19 0
WinForm 直接运行 Admin.NET
|
3月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
3月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
109 3
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
45 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
72 0