Benchmark

.NET Core 3.1 的REST 和gRPC 性能测试

情到浓时终转凉″ 提交于 2020-08-06 11:34:26
看到越南小哥 的github 上的 Evaluating Performance of REST vs. gRPC , 使用的是.NET Core 3.0 , 今天我把它升级到.NET Core 3.1 同样做了一个测试,文章的结果和他的博客文章是一样的: https://dev.to/thangchung/performance-benchmark-grpc-vs-rest-in-net-core-3-preview-8-45ak 。 在8年前我写过一篇文章: WCF和ASP.NET Web API在应用上的选择 。 现在是2020年了,WCF换成了gRPC, ASP.NET Web API换成了ASP.NET Core Web API, 对外提供标准化的REST服务,内部通信采用gRPC的也是新时代的.NET应用程序的一个好选择,类似于Kubernetes 架构将有效负载格式用于传输协议的方式。 我们来看下.NET Core 3.1下REST和gRPC的性能表现怎么样? 从 https://github.com/geffzhang/RESTvsGRPC 下载代码。在测试机器上安装.NET Core 3.1。 REST API: cd RESTvsGRPC\RestAPI dotnet run -p RestAPI.csproj -c Release gRPC API: cd

JVM系列之:String.intern的性能

∥☆過路亽.° 提交于 2020-08-06 04:01:09
简介 String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成的字符串的数量,推荐尽量直接使用String Table中的字符串常量池中的元素。 那么String.intern的性能怎么样呢?我们一起来看一下。 String.intern和G1字符串去重的区别 之前我们提到了,String.intern方法会返回字符串常量池中的字符串对象的引用。 而G1垃圾回收器的字符串去重的功能其实和String.intern有点不一样,G1是让两个字符串的底层指向同一个byte[]数组。 有图为证: 上图中的String1和String2指向的是同一个byte[]数组。 String.intern的性能 我们看下intern方法的定义: public native String intern(); 大家可以看到这是一个native的方法。native底层肯定是C++实现的。 那么是不是native方法一定会比java方法快呢? 其实native方法有这样几个耗时点: native方法需要调用JDK-JVM接口,实际上是会浪费时间的。 性能会受到native方法中HashTable实现方法的制约,如果在高并发的情况下,native的HashTable的实现可能成为性能的制约因素。 举个例子 还是用JMH工具来进行性能分析,我们使用String.intern

从经典到最新前沿,一文概览2D人体姿态估计

烈酒焚心 提交于 2020-08-04 19:32:40
点击上方“ 3D视觉工坊 ”,选择“星标” 干货第一时间送达 作者:谢一宾 | 来源:知乎 https://zhuanlan.zhihu.com/p/140060196 本文仅做学术分享,如有侵权,请联系删除。 前言 本文主要讨论2D的人体姿态估计,内容主要包括:基本任务介绍、存在的主要困难、方法以及个人对这个问题的思考等等。希望大家带着批判的目光阅读这篇文章,和谐讨论。 介绍 2D人体姿态估计的目标是定位并识别出人体关键点,这些关键点按照关节顺序相连,就可以得到人体的躯干,也就得到了人体的姿态。 在深度学习时代之前,和其他计算机视觉任务一样,都是借助于精心设计的特征来处理这个问题的,比如pictorial structure。凭借着CNN强大的特征提取能力,姿态估计这个领域得到了长足的发展。2D人体姿态估计主要可以分为单人姿态估计(Single Person Pose Estimation, SPPE)和多人姿态估计(Multi-person Pose Estimation, MPPE)两个子任务。 单人姿态估计是基础,在这个问题中,我们要做的事情就是给我们一个人的图片,我们要找出这个人的所有关键点,常用的MPII数据集就是单人姿态估计的数据集。 在多人姿态估计中,我们得到的是一张多人的图,我们需要找出这张图中的所有人的关键点。对于这个问题,一般有自上而下(Top-down

PHP通过加锁实现并发情况下抢码功能

↘锁芯ラ 提交于 2020-08-04 16:43:31
基于php语言使用加锁实现并发情况下抢码功能,特定时间段开放抢码并不允许开放的码重复: 需求:抢码功能 要求: 1、特定时间段才开放抢码; 2、每个时间段放开的码是有限的; 3、每个码不允许重复; 实现: 1、在不考虑并发的情况下实现: function get_code($len){   $CHAR_ARR = array('1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','X','Y','Z','W','S','R','T');   $CHAR_ARR_LEN = count($CHAR_ARR) - 1;   $code = '';   while(--$len > 0){       $code .= $CHAR_ARR[rand(0,$CHAR_ARR_LEN)];     }   return $code; } $pdo = new PDO('mysql:host=localhost;dbname=ci_test','root','root'); //查询当前时间已发放验证码数量 $code_num_rs = $pdo->query("SELECT COUNT(*) as sum FROM code_test");

Redis的安装与idea中的使用

不打扰是莪最后的温柔 提交于 2020-08-04 11:44:46
一、Redis的安装 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。 官方下载地址: http://redis.io/download ,不过官方没有64位的Windows下的可执行程序。 目前有个开源的托管在github上, 地址: https://github.com/ServiceStack/redis-windows 点击这个地方,下载文件并解压到自己的电脑目录下。 本文使用版本: redis64-3.0.501.zip 解压后目录如下: 文件名 简要 redis-benchmark.exe 基准测试 redis-check-aof.exe aof redischeck-dump.exe dump redis-cli.exe 客户端 redis-server.exe 服务器 redis.windows.conf 配置文件 然后编辑 redis.windows.conf 文件,我看网上有的教程说编辑里边 maxheap <bytes> ,但是3.x版本以后,修改的是 maxmemory <bytes> , bytes是字节,请自行换算,我这里改成

揭秘 TARS 基金会:新一代海量微服务开源生态

﹥>﹥吖頭↗ 提交于 2020-08-04 11:28:59
“云原生(Cloud Native)”现在已经是一个唱遍大江南北的词,相比它的上一代术语“云计算”,云原生更加强调“应用原生长在云上”。 上世纪 50 年代末,虚拟化被提出来,如今看来,这成了云计算基础架构的基石。云计算发展到如今近 60 年,期间各种云相关的技术不断出现,PaaS、IaaS 与 SaaS 是最早一批基于云概念的实际应用,而后出现的 FaaS、BaaS 与 Serverless 等,也在为云不断增添新的动力。 在这个过程中,为了达到在构建应用时“云端优先”的新兴思想,云原生的概念应运而生。云原生的原生指的是在 最初设计应用时就原生为云环境做出相应考量 ,以此在云上充分利用和发挥云平台的各种能力,包括低成本、按需付费、系统弹性可伸缩、高度可管理、业务逻辑解耦等。 Linux 基金会专门成立了云原生计算基金会(CNCF,Cloud Native Computing Foundation)以发展云原生技术,伴随着这几年云原生的快速发展,CNCF 如今也成为了该领域最权威的组织。 由 CNCF 主办的 “CloudNative + Open Source Virtual Summit China 2020 中国线上峰会” 正在进行中,为期 3 天的大会将带来上百场分享,内容将覆盖云原生的方方面面,包括微服务架构、容器、可观察性、存储、安全、身份、策略、开源生态、网络与 CI

小师妹学JVM之:cache line对代码性能的影响

懵懂的女人 提交于 2020-07-29 05:35:13
简介 读万卷书不如行万里路,讲了这么多assembly和JVM的原理与优化,今天我们来点不一样的实战。探索一下怎么使用assembly来理解我们之前不能理解的问题。 一个奇怪的现象 小师妹:F师兄,之前你讲了那么多JVM中JIT在编译中的性能优化,讲真的,在工作中我们真的需要知道这些东西吗?知道这些东西对我们的工作有什么好处吗? um...这个问题问得好,知道了JIT的编译原理和优化方向,我们的确可以在写代码的时候稍微注意一下,写出性能更加优秀的代码,但是这只是微观上了。 如果将代码上升到企业级应用,一个硬件的提升,一个缓存的加入或者一种架构的改变都可能比小小的代码优化要有用得多。 就像是,如果我们的项目遇到了性能问题,我们第一反应是去找架构上面有没有什么缺陷,有没有什么优化点,很少或者说基本上不会去深入到代码层面,看你的这个代码到底有没有可优化空间。 第一,只要代码的业务逻辑不差,运行起来速度也不会太慢。 第二,代码的优化带来的收益实在太小了,而工作量又非常庞大。 所以说,对于这种类似于鸡肋的优化,真的有必要存在吗? 其实这和我学习物理化学数学知识是一样的,你学了那么多知识,其实在日常生活中真的用不到。但是为什么要学习呢? 我觉得有两个原因,第一是让你对这个世界有更加本质的认识,知道这个世界是怎么运行的。第二是锻炼自己的思维习惯,学会解决问题的方法。 就想算法

初创公司风险投资:一场全垒打的比赛

流过昼夜 提交于 2020-07-28 18:48:15
   在不确定的经济条件下,风投这十年步履蹒跚,但始终未变的方向是寻找具有颠覆性的企业。   过去的十年里,风险资本迅猛增长。   在数十亿美元退出、硅谷初创企业爆炸式增长以及软银 1000 亿美元愿景基金大规模融资的推动下,全球年度资本投资从 2010 年到 2019 年增长了近 13 倍,达到 1600 亿美元。与此同时,超大轮投资(投资额在 1 亿美元以上)数量从 2016 年到 2018 年几乎增长了两倍。    图 | 过去十年全球 VC 投资额及投资数量统计(来源:CB Insights)   然而, 新冠肺炎带来的经济下行在一定程度上抑制了投资交易 。投资于种子轮公司的风投越来越少,据统计 2020 年 3 月,美国整体风投交易同比下降 22%。疫情让投资者在投资时更加挑剔,他们更倾向于把钱交给那些证明自己有足够实力经受住疫情带来的冲击,并在经济回升时可以实现增长的公司。   但其实风险投资在很多方面都可以抵御短期风险,原因很简单,风险投资是长期的。VC 并不一定要投资那些在短期之内会有巨大增长的初创公司;他们真正希望寻找到的是那些能在 10 年后成长为行业内顶尖的公司。   总体而言,风险投资的基本策略从来没有改变过。他们更愿意 将赌注押在具有突破性技术/产品或是从根本上改变一个行业的初创公司上 。   在这份报告中,我们将通过解释风险投资中的关键定义

Redis Conf 2020之提高Redis访问速度最佳实践

♀尐吖头ヾ 提交于 2020-07-28 09:39:10
来源:Zohaib Sibte Hassan from Doordash and RedisConf 2020 (redisconf.com/) organized by Redis Labs (redislabs.com) 翻译:Wen Hui 转载:中间件小哥 Cache stampede问题: Cache stampede问题又叫做cache miss storm,是指在高并发场景中,缓存同时失效导致大量请求透过缓存同时访问数据库的问题。 如上图所示: 服务器a,b 访问数据的前两次请求因为redis缓存中的键还没有过期,所以会直接通过缓存获取并返回(如上图绿箭头所示),但当缓存中的键过期后,大量请求会直接访问数据库来获取数据,导致在没有来得及更新缓存的情况下重复进行数据库读请求 (如上图的蓝箭头),从而导致系统比较大的时延。另外,因为缓存需要被应用程序更新,在这种情况下,如果同时有多个并发请求,会重复更新缓存,导致重复的写请求。 针对以上问题,作者提出一下第一种比较简单的解决方案,主要思路是通过在客户端中,通过给每个键的过期时间引入随机因子来避免大量的客户端请求在同一时间检测到缓存过期并向数据库发送读数据请求。在之前,我们定义键过期的条件为: Timestamp+ttl > now() 现在我们定义一个gap值,表示每个客户端键最大的提前过期时间

Apache Hudi重磅特性解读之全局索引

烈酒焚心 提交于 2020-07-27 15:18:01
1. 摘要 Hudi表允许多种类型操作,包括非常常用的 upsert ,当然为支持 upsert ,Hudi依赖索引机制来定位记录在哪些文件中。 当前,Hudi支持分区和非分区的数据集。分区数据集是将一组文件(数据)放在称为分区的桶中的数据集。一个Hudi数据集可能由N个分区和M个文件组成,这种组织结构也非常方便hive/presto/spark等引擎根据分区字段过滤以返回有限的数据量。而分区的值绝大多数情况下是从数据中得来,这个要求一旦一条记录映射到分区/桶,那么这个映射应该 a) 被Hudi知道;b) 在Hudi数据集生命周期里保持不变。 在一个非分区数据上Hudi需要知道recordKey -> fileId的映射以便对记录进行 upsert 操作,现有解决方案如下:a) 用户/客户端通过payload提供正确的分区值;b) 实现GlobalBloomIndex索引来扫描指定路径下的所有文件。上述两个场景下,要么需要用户提供映射信息,要么会导致扫描所有文件的性能开销。 这个方案拟实现一种新的索引类型,维护 (recordKey <-> partition, fileId) 映射或者 ((recordKey, partitionPath) → fileId) 映射,这种映射由Hudi存储和维护,可以解决上述提到的两个限制。 2. 背景 数据集类型