Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在结构性能影响中包装C#原语

在结构性能影响中包装C#原语
EN

Stack Overflow用户
提问于 2020-11-29 14:49:10
回答 1查看 49关注 0票数 0

我正在写一些关于几何处理的代码,delaunay三角剖分,更具体地说,我需要它更快,所以我使用简单的原语数组作为数据结构来表示三角剖分信息,这是它的一个示例

代码语言:javascript
运行
AI代码解释
复制
        private readonly float2[] points;
        private readonly int[] pointsHalfEdgeStartCount;
        private readonly int[] pointsIncomingHalfEdgeIndexes;

假设我想要快速迭代通过索引点p的所有传入半边,我只需使用预计算数组来实现:

代码语言:javascript
运行
AI代码解释
复制
int count = pointsHalfEdgeStartCount[p * 2 + 1];

for (int i = 0; i < count; i++)
{
    var e = pointsIncomingHalfEdgeIndexes[pointsHalfEdgeStartCount[p * 2] + i]
}

// pointsHalfEdgeStartCount[p * 2] is the start index

这是足够快的,但感觉并不安全或非常清楚。所以我有了将我的索引包装到struct中的想法,以使其更清晰,同时保留性能,类似于:

代码语言:javascript
运行
AI代码解释
复制
public readonly struct Point
{
    public readonly int index;
    public readonly DelaunayTriangulation delaunay

    public Point(int index, DelaunayTriangulation delaunay)
    {
        this.index = index; 
        this.delaunay = delaunay;
    }

            
    public int GetIncomingHalfEdgeCount() => delaunay.pointsEdgeStartCount[index * 2 + 1];
    public HalfEdge GetIncomingHalfEdge(int i)
    {
        return new HalfEdge(
            delaunay,
            delaunay.pointsIncomingHalfEdgeIndexes[delaunay.pointsEdgeStartCount[index * 2] + i]
        );
    }

    //... other methods
}

然后我就可以这样做了:

代码语言:javascript
运行
AI代码解释
复制
int count = p.GetIncomingHalfEdgeCount();

for (int i = 0; i < count; i++)
{
    var e = p.GetIncomingHalfEdge(i);
}

然而,这有点扼杀了我的性能,在我做的基准测试中要慢得多(大约10倍),遍历所有的点和所有传入的半边。我猜是因为在每个point结构中存储对delaunay triangulaiton的引用是一种明显的浪费,并且减慢了所有涉及点的操作,因为有两倍的数据量要移动。

我可以让DelaunayTriangulation成为一个静态类,但由于其他原因它并不实用,所以我这样做了:

代码语言:javascript
运行
AI代码解释
复制
public readonly struct Point
{
    public readonly int index;
    
    public Point(int index) => this.index = index;

            
    public int GetIncomingHalfEdgeCount(DelaunayTriangulation delaunay) => delaunay.pointsEdgeStartCount[index * 2 + 1];
    public HalfEdge GetIncomingHalfEdge(DelaunayTriangulation delaunay, int i)
    {
        return new HalfEdge(
            delaunay.pointsIncomingHalfEdgeIndexes[delaunay.pointsEdgeStartCount[index * 2] + i]
        );
    }

    //... other methods
}

我可以这样做:

代码语言:javascript
运行
AI代码解释
复制
int count = p.GetIncomingHalfEdgeCount(delaunay);

for (int i = 0; i < count; i++)
{
    var e = p.GetIncomingHalfEdge(delaunay, i);
}

它的速度要快得多,但仍然比使用简单int的第一种方法慢2.5倍。我想知道这是否可能是因为我在第一个方法中获得了int,而在其他方法中获得了HalfEdge结构(类似于Point结构的结构,只包含一个索引作为数据和几个方法),并且当我使用Point实例化一个新的HalfEdge结构时,普通的int和更快的结构之间的差异消失了。虽然我不确定为什么仍然如此costly.Weirder,但为了清楚起见,我尝试了在Delaunay类中编写方法而不是Point结构的选项:

代码语言:javascript
运行
AI代码解释
复制
// In the DelaunayTriangulation class:

public int GetPointIncomingHalfEdgeCount(Point p) => pointsEdgeStartCount[p.index * 2 + 1];
public HalfEdge GetPointIncomingHalfEdge(Point p, int i)
{
    return new HalfEdge(
        pointsIncomingHalfEdgeIndexes[pointsEdgeStartCount[p.index * 2] + i]
        );
}

我是这样使用它的:

代码语言:javascript
运行
AI代码解释
复制
int count = delaunay.GetPointIncomingHalfEdgeCount(p);

for (int i = 0; i < count; i++)
{
    var e = delaunay.GetPointIncomingHalfEdge(p, i);
}

它比之前的方法慢了3倍!我不知道为什么。

我尝试使用反汇编来查看生成了什么机器代码,但失败了(我正在使用Unity3D)。我是否注定要在数组中依赖普通的int和合理的变量命名,并放弃尝试进行一些编译时类型检查(这个int真的是点索引吗?)

我甚至没有提出其他问题,比如,当我尝试使用具有如下收益的IEnumerable类型时,为什么它会更慢:

代码语言:javascript
运行
AI代码解释
复制
public IEnumerable<int> GetPointIncomingHalfEdges(Point p)
{
    int start = pointsEdgeStartCount[p.index * 2]; // this should be a slight optimization right ?
    int count = pointsEdgeStartCount[p.index * 2 + 1];
    for (int i = 0; i < count; i++)
    {
        yield pointsIncomingHalfEdgeIndexes[start + i];
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-11-29 17:19:12

我已经为主动内联添加了一个编译器指令,它似乎弥补了时间上的差异!由于某些原因,编译器无法正确内联以下内容:

代码语言:javascript
运行
AI代码解释
复制
var e = delaunay.GetPointIncomingHalfEdge(p, i);

虽然它成功地通过

代码语言:javascript
运行
AI代码解释
复制
var e = p.GetIncomingHalfEdge(delaunay, i);

为什么?我不知道。然而,如果我能够看到代码是如何编译的,而我不知道如何做到这一点,那就容易多了。我会搜索它,也许会打开另一个问题,如果我找到更好的解释,我会回来的!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65061400

复制
相关文章
(译) 如何使用 React hooks 获取 api 接口数据
在本教程中,我想向你展示如何使用 state 和 effect 钩子在React中获取数据。 你还将实现自定义的 hooks 来获取数据,可以在应用程序的任何位置重用,也可以作为独立节点包在npm上发布。
Nealyang
2019/09/29
28.7K0
通过Zabbix API获取历史监控数据
Zabbix API可以通过JSON RPC协议来获取历史数据。 可以采用脚本或者任何支持JSON RPC的工具来使用API。
星哥玩云
2022/06/30
2.3K0
ABAP随笔-通过api获取新冠数据
Title Fiori获取新冠病毒API数据 突发奇想想要使用abap去获取个网站上公布的api,然后显示一下 就当最近学习NEPTUNE的小练习吧 百度一下获取疫情的网站API,也可以自己去ti
Tab Zhu
2022/06/27
1.1K0
ABAP随笔-通过api获取新冠数据
React通过jsonp来请求接口获取数据渲染数据
Fetch-jsonp https://github.com/camsong/fetch-jsonp
王小婷
2019/11/10
3K0
react: 怎么优雅使用获取数据
note: 如果你想了解最新的 react hooks 来获取处理数据的方法:https://www.robinwieruch.de/react-hooks-fetch-data/
西南_张家辉
2021/02/02
1.6K0
【React Native实战教程】GitHub Trending API数据的获取
GitHub Popular中有个treding模块,该模块是GitHub的treding的手机版,在这个模块中你可以使用只有在PC上才能使用的功能。为了开发这个treding模块我们需要获取GitHub的treding的API数据。不过不幸的的是GitHub并没有开放有关trending的API,所以想调GitHub的treding的API已经是不现实的了。
CrazyCodeBoy
2018/05/07
2.3K0
【React Native实战教程】GitHub Trending API数据的获取
ApplicationContext可以同时获取多个Bean吗?
在实际场景中提供了N个接口给第三方,常规情况下是不会同时调用的,如果N个接口同时调用,随着接口的数量和业务场景逻辑增加,将会给服务带来很不好的体验,但恰恰业务就是如此,面对同一类型的业务查询场景,我将策略模式应用到此接口上来应对。关于实际设计的demo可参考往期文章炫技?No.
疯狂的KK
2023/01/12
1.1K0
ApplicationContext可以同时获取多个Bean吗?
API网关怎么部署 不用api网关可以吗?
许多在互联网公司工作的人都了解api网关。所谓的api网关,就是一个统一的微服务应用访问入口。由于现在许多企业的应用APP功能繁多,种类交叉,所以一个统一的api网关入口可以帮助用户通过一个入口顺利的直达不同的微服务当中。不仅给用户访问带来方便,对于服务端的运维工作也会带来极大的方便,下面来看一看API网关怎么部署?
用户8715145
2021/12/21
2.6K0
通过Java API获取Hive Metastore中的元数据信息
在文章中,我们说到Hive 3.0.0版本开始,其单独提供了standalone metastore服务以作为像presto等处理引擎的元数据管理中心。
从大数据到人工智能
2022/01/19
2.9K0
怎样使用React Context API [每日前端夜话0x26]
React Context API 【https://reactjs.org/docs/context.html】现在已经成为一个实验性功能,但是只有在 React 16.3.0 【https://reactjs.org/blog/2018/03/29/react-v-16-3.html】中才能用在生产中。本文将向你展示两个基本的 Web 商店应用程序,一个使用了 Context API 进行构建,另一个则不用。
疯狂的技术宅
2019/03/27
9920
怎样使用React Context API [每日前端夜话0x26]
如何通过CM API优雅的获取元数据库密码
人啊,上了年纪了,总容易忘记一些事情,比如你一不小心就忘记了CDH集群Hive,Hue和Sentry服务的元数据库密码,对于数据库(MySQL/Oracle/PostgreSQL)管理员来说,可能有自己独特的一些奇技淫巧来找回密码。但对于咱普通人,其实Cloudera Manger提供了一种很优雅的方式让你找回元数据库密码,那就是神奇的Cloudera Manager API。
Fayson
2018/03/29
3.2K0
如何通过CM API优雅的获取元数据库密码
2021年50个酷炫的Web和移动项目创意
当想到项目创意时,很多人都在挣扎。这里列出了50个您可以在2021年完成的很棒的项目构想。我将以下列的技术栈为例,以便您弄清楚自己也可以做到这一点。这些应用程序可以在Web,移动和桌面上。您可以使用无数种工具,技术和编程语言来构建它们,我仅在此处显示一些用例。每个项目的编程级别均为初学者,中级或高级。这些应用程序可以创建为前端,后端或全栈。
海拥
2021/08/23
4.4K0
2021年50个酷炫的Web和移动项目创意
通过 Drone Rest API 获取构建记录日志
Drone是一款CICD工具,提供rest API,简单介绍下如何使用API 获取构建日志。
JadePeng
2020/02/18
1.2K0
通过post请求api获取土味情话
用的ALAPI,自己申请token填上即可。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title>
岳泽以
2022/10/26
7660
前端小白躺平摆烂可以吗
这几年毕业的大学生有多苦都不必我们说了。大学才4年,疫情占3年,好不容易熬到毕业,找工作又进入了炼狱模式。
物立
2022/08/30
4460
设计通过 POST 获取数据的 API 时需要注意的问题
现代网站越来越多的使用前后端分离架构,先用前端 MVC 框架快速堆砌出 SPA,再用 API 获取动态数据也已经成为日常的开发内容;而用来连接前后端的 API,其重要性也自然言而喻。做为一个前端码农,认识后端的 API 设计方式也是很重要的,今天让我们针对 API 设计来一探究竟。
疯狂的技术宅
2020/11/03
1.7K0
设计通过 POST 获取数据的 API 时需要注意的问题
Google JavaScript API 的使用
您可以使用JavaScript客户端库与Web应用程序中的Google API(例如,人物,日历和云端硬盘)进行交互。请按照此页面上的说明进行操作。
拿我格子衫来
2022/01/24
3.1K0
React Native迎来重大架构升级,性能将大幅提升
作者 | 郭蕾 7 月 14 日,React Native 核心团队的 Joshua Gross 在 Twitter 说,RN 的新架构已经在 Facebook 内部落地了,并且 99% 的代码已经开源。这次的架构升级“蓄谋已久”,Joshua 说他们从 2018 年 1 月就开始规划了。 Facebook 曾在 2018 年 6 月宣布了大规模 重构 RN 的计划和路线图,整个的重构目的是为了让 RN 更轻量化、更适应混合开发,接近甚至达到原生的体验。具体包括以下几个方面: 改变线程模型。UI 更新不再
深度学习与Python
2023/04/01
1.6K0
React Native迎来重大架构升级,性能将大幅提升
JQuery JavaScript常用API整理(前端入门必学)
现在MVVM框架逐渐占据了主要市场,很多老项目也逐渐的从jQuery转向了MVVM架构!JQuery还有必要学吗? 我的答案是jQuery必须学! JavaScript是基础,JQuery能让DOM操作更方便,哪怕用vue react当操作dom的时候 还是离不开的,只是说可以不用学的那么深。
鱼找水需要时间
2023/02/16
7140
点击加载更多

相似问题

如何通过javascript使用twitter API

11

是否可以通过Facebook API (比如通过Twitter API?)获取@提及

11

通过Twitter API javascript从时间线获取Twitter状态

11

REST Api:无法在前端获取数据(NodeJS/React)

13

React:无法通过API获取数据

119
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档