c# 排查cpu高的函数和内存高的对象

一,背景

最近自己对c# 写的程序进行优化,我首先看代码,分析哪些代码是有问题,这种方式最枯燥,效率也不高,很难发现代码有问题。于是我发现c# 调试会有一个诊断工具,我们可以对内存快照和cpu使用率进行记录

二,逻辑

这种分析通过内存对象引用对象和占内存大小,进行分析,内存分析比较麻烦,必须自己对程序有比较多理解,结合逻辑分析。

CPU分析比较简单,通过时间段分析,哪些占用CPU比较高,然后对应分析就能很快分析出来。

三,例子

待补充,等以后专门记录分析。暂时记录一下,一个知识点记录。

自己也有别的内存泄漏分析工具,但实际效果不是那么好,虽然有一些帮助,这类解决分析,还是看应用和调用过程,如果引用的数目过高,如果不符合自己预期,基本就是有泄漏了。我觉得c#内存泄漏反而不是那么好排查,如果c++ 可能好一点,因为c#有GC,什么时候被释放这个是底层来实现的。c++ 我直接delete,我只要记录哪些是New的对象,然后过一段时间后,然后去检测没有被释放对象有哪些,再根据代码就比较容易找出来。

fishtools 1.0.0.8更新

一,更新内容

  • 支持后退
  • 支持前进
  • 美化界面
  • 其他优化

二,界面

三,下载地址

链接:https://pan.baidu.com/s/1p6-d2aAw-at0D5MfNQft6g
提取码:1234

四,补充

目前工具目前满足自己继承所有web的功能,后续会跟进自己需求增加一些功能进来。

node js 后台解析HTML(获取微博热门搜搜)

一,背景

最近自己准备写一个热门排行榜的功能,自己百度一下Node js 能够解析html的库,自己找到cheerio,这个库发现非常适合自己,因为他的用法跟jquery 类似。于是我拿微博热门搜索来练手,熟悉cheerio库,顺便用一个node js 网络库got

二,逻辑

通过网页源代码,可以分析每个tr下面td class=td-02 下面a标签就是我们要找的元素,那么通过jquery 语法写法 $(“tbody>tr>td.td-02>a”),逻辑就这么简单。

三,代码

const html_parse = require("cheerio")
const got = require("got")

async function getWeibo(){
    var all_data = []
    var respond = await got("https://s.weibo.com/top/summary?cate=realtimehot", {headers:{
        "user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.78"
    }})

    if(respond.body){
        let $ = html_parse.load(respond.body)
        let items = $("tbody>tr>td.td-02>a")

        for(let i = 1; i < 10 && i < items.length; i++){
            let item = "https://s.weibo.com";
            let href = $(items[i]).attr("href")
            let text = $(items[i]).text()
            all_data.push({
                href: item + href,
                text: text
            })
        }
    }
    return all_data
}


async function test(){
    let r = await getWeibo()
    console.log(r)
}

test()

代码是不是非常简单,await 只是异步语法糖,自从我用c# 就喜欢用这个语法,避免死亡回调,网络库用got ,我请求替换user-agent,貌似微博也没有做限制,你不设置照样也能获取数据,但我还是加了,以免带来不必要的麻烦,这里面let i = 1 从开始循环,因为它有一个置顶元素,设置1直接过滤掉,这里10 只是我自己主要10条,你可以通过参数传递获取条数。

四:效果图

五,补充

我以前解析html,我都是当成字符串切割,然后再自己解析,虽然这种比较快,但写代码每次都要计算切割,不够通用,如果直接用Html 解析库,就很容易获取了,特别这种类似jquery的查找方法的。


自己最近写前端比较多,经常看到说jquery 落寞之类,我自己反复思考这个问题,我觉得这个无稽之谈。jquery 只是封装操作dom的类而已,vue 或者 react 他们另外数据库绑定而已,他们只是隐藏了dom操作而已,但他们底层也必须实现dom操作元素。对于新手来说用vue 或者react 等等非常舒服,但毕竟不是根本。html + javascript + css 这个永远不会变,那么dom操作永远都需要。这个就好像windows开发程序员,你用了mfc封装 window 操作类,你就觉得windows api 是垃圾可笑。

我觉得开发不能完全只管业务,不去了解任何有关底层知识,这种就是舍本逐源的做法。

javascript this 探索

一,背景

自己是以C入门的,然后c++,然后c#,然后java,然后python 然后node js,然后其他。。。对javascript this 理解与以前其他语言有出入,导致使用的时候会遇到this指向问题,我估计对于新手应该都会遇到这个问题。

二,坑

javascript中 funtion是对象,这句话我相信很多新手都会听到,那么自然认为在function 中的this就是指向本身,因为这句话本身是错误,那么我们用this怎么可能是对呢。反正我被同事错误说法误导很多次了。。。

三,代码

<!DOCTYPE html>
<html>
    <script>
        function foo(){
            console.log(this.a)
        }

        var a = "我在windows作用域里面"
        var obj = {
            a:"我在obj的作用域",
            foo: foo
        }

        foo()   //全局作用域 
        obj.foo()   //obj作用域
        var temp_function = obj.foo
        temp_function() //全局,跟调用的时候绑定

        
    </script>
</html>

四,说明

this 是在调用时候绑定,跟敲代码作用域没有关系,而跟调用作用域有关系。

五,书籍

<你不知道的javascript>,看他的第二部分this内容写的这边博客,自己总结一下。


六,补充

可以看mdn 官网权威文档介绍,js 万物皆对象,函数的this是动态绑定,这个跟我们其他高级语言不一样,编译的器已经确定this指向了

this – JavaScript | MDN (mozilla.org)

electron 拦截下载,启动浏览器下载

一,说明

electron 不像浏览器会带下载管理,electron 页面调用下载的话,无法感知下载进度,我这里偷懒,直接丢给默认浏览器下载。

二,代码

    one_plugin_ui.webContents.session.on("will-download", (event, item, webContents)=>{
      let url = item.getURL()
      item.cancel()
      shell.openExternal(url);
      webContents.loadFile("download.html")
    })
  • one_plugin:electron的 windows
  • win-download:触发下载事件
  • item.cancel():取消electron默认下载逻辑
  • shell.openExternal:调用默认程序(浏览器)打开url
  • webContents.loadFile:加载自己定义下载界面【因为点击文件下载,会弹出新的窗口,默认是空白的,为了体验好一点,我增加一个提示下载的页面】
  • item: 对应的electron的对象 downloaditem

三,文档

downloaditem的介绍

fishtools 1.0.0.5 更新

一,作用

本软件目的扩展现有web网页,变成自己本地应用。

二,更新

  • 增加无痕模式,方便多个账号使用
  • 增加右键菜单,方便使用
  • 使用系统浏览器下载
  • 其他小的优化

三,细节

1:右键菜单

增加置顶和开发者模式,这样子方便自己调试脚本

2:增加系统下载

要electron下载走系统默认浏览器,因为electron没有下载页面,必须自己实现才可以。我懒的写下载页面,直接要他跳默认浏览器即可。这个功能我主要用于下载考虑。

四,总结

目前自己用起来非常顺手,后续慢慢增加优化,优化给自己用。

链接:https://pan.baidu.com/s/1CbE9oUISgyTyVg5Pv5Ug2w
提取码:1234