小编tob*_*ora的帖子

Haskell:如何检测“惰性内存泄漏”

经过几个小时的调试,我意识到一个非常简单的玩具示例由于缺少!表达式而效率不高return $ 1 + x(感谢 duplode!...但是 ghc 怎么不优化它??)。我也意识到了这一点,因为我将它与更快的 Python 代码进行比较,但我不会总是编写 Python 代码来对我的代码进行基准测试......

所以这是我的问题:有没有办法自动检测这些“懒惰的内存泄漏”,这会无缘无故地减慢程序的速度?我在优化 Haskell 代码方面仍然很糟糕,而且!很可能会忘记 a ,即使您有经验,我猜也是如此。

我知道:

  • +RTS -s,但我不知道如何解释它:看到79MB的内存为一个简单的程序似乎是巨大的,以我为例子,但也许它不是因为它是什么把我目前的计划......而更大的计划,这是不可能,只是检测我猜是这样的“惰性泄漏”,因为我不知道我的程序应该占用多少内存。
  • cabal v2-run --enable-profiling mysatsolvers -- +RTS -p命令,但似乎使探查杀死由GHC做了一些优化技术,因此它很难使用这些值,真正的标杆。而且,我仍然不清楚如何从该输出中找到泄漏。

例如,您能否向我解释如何在这样的玩具程序中找到“懒惰的泄漏”?

{-# LANGUAGE DerivingVia, FlexibleInstances, ScopedTypeVariables #-}
module Main where

--- It depends on the transformers, containers, and base packages.
--- Optimisation seems to be important or the NoLog case will be way to long.
--- $ ghc -O Main.hs

import …
Run Code Online (Sandbox Code Playgroud)

optimization haskell memory-leaks lazy-evaluation

35
推荐指数
2
解决办法
3012
查看次数

Reactjs开发工具:钩子号不存在

为了理解为什么组件会在没有明显原因的情况下重新渲染,我启动了分析器。我可以看到我的组件重新渲染,因为Hook 18

\n

在此输入图像描述

\n

因此,为了理解这意味着什么,我尝试遵循这个问题中的建议What does the hook number in the Reactjs Dev tool irrespect to? 这基本上是说钩子列在相应的组件选项卡中。所以我去了\xe2\x80\xa6,但是我的钩子没有列在这里:最大钩子是15,而不是18!

\n

在此输入图像描述

\n

知道我\xe2\x80\x99m 缺少什么吗?I\xe2\x80\x99m 确保我选择了正确的组件,因为同一组件两次都突出显示。

\n

reactjs react-hooks

12
推荐指数
0
解决办法
1422
查看次数

Javascript:帧精确视频停止

我希望能够在视频到达某些指定帧时稳健地停止视频,以便根据使用 Blender、Manim 制作的视频进行口头演示...

我知道这个问题,但问题是视频没有完全停在好帧处。有时它会继续前进一帧,当我强制它返回到初始帧时,我们会看到视频向后退,这很奇怪。更糟糕的是,如果下一帧完全不同(不同的背景......),这将非常明显。

为了说明我的问题,我在这里创建了一个演示项目(只需单击“下一步”即可看到当视频停止时,有时会倒退)。完整的代码在这里

我正在使用的代码的重要部分是:

      var video = VideoFrame({
          id: 'video',
          frameRate: 24,
          callback: function(curr_frame) {
              // Stops the video when arriving on a frames to stop at.
              if (stopFrames.includes(curr_frame)) {
                  console.log("Automatic stop: found stop frame.");
                  pauseMyVideo();
                  // Ensure we are on the proper frame.
                  video.seekTo({frame: curr_frame});
              }
          }
      });
Run Code Online (Sandbox Code Playgroud)

到目前为止,我通过在结束前停止一帧然后使用seekTo(不确定这听起来如何)来避免这个问题,如此处所示。但正如您所看到的,有时当进入下一帧时,它会有点“冻结”:我想这是在seekTo.

PS:如果你知道 JS 中一种可靠的方法来了解给定视频的帧数,我也很感兴趣。

关于在桌面上预先剪切视频的想法,可以使用......但我过去在这方面有过不好的经验,特别是更改视频有时会产生一些故障。此外,它的使用可能会更复杂,这意味着视频应该手动剪切很多时间,重新编码......

编辑是否有任何解决方案,例如基于WebAssembly(与旧浏览器更兼容)或Webcodec(更高效,但尚未广泛传播)?Webcodec 似乎允许非常令人惊奇的事情,但我不知道如何使用它们。我很想听到基于它们的解决方案,因为 Firefox 尚不处理 webcodec。请注意,如果在此过程中音频不会丢失,那就太好了。如果我还可以根据要求显示控件,那就太好了。

编辑:我不确定这里发生了什么( …

javascript video html5-video webassembly webcodecs

8
推荐指数
1
解决办法
2258
查看次数

Android WebView:在 Lineage OS 上使用 firefox/gecko 浏览器引擎

在 Lineage OS 上(也许在任何 Android 上?),可以更改默认的 WebView 渲染(默认设置为AOSP Browser,即没有 GAPPS 的默认 Android 浏览器)。当我安装 Chrome 时(即使没有安装 GAPPS),我可以Chrome在设置/开发中将此默认值更改为(这对我来说很实用,因为默认浏览器有一些烦人的错误)。

是否也可以使用 Firefox 的引擎而不是浏览器/Chrome(我不想安装 Chrome 并依赖专有软件)?仅安装 Firefox(FDroid 上的 Fennec)还不够。

谢谢!

android android-webview lineageos

6
推荐指数
1
解决办法
5940
查看次数

Haskell:在不需要日志时使 Writer 与普通代码一样高效

我想编写一个可以在两种“模式”下运行的代码:

  • 无论是在日志模式下,即它应该记录一些信息(在我的情况下,我想记录在给定时间对某些特定功能进行的调用次数)
  • 或在高效模式下,即它不记录任何内容而只是尽可能快地运行

我尝试编写以下代码,它创建了两个 Writer,一个普通的(用于日志记录模式)和一个愚蠢的(不记录任何内容,用于高效模式)。然后我定义了一个新类LogFunctionCalls,允许我在这两个 Writer 之一中运行我的函数。

但是,我尝试使用 Stupid writer 比较代码的速度,它比没有 writer 的普通代码要慢得多:这里是分析信息:

  • 没有编写器的代码:总时间 = 0.27 秒,总分配 = 55,800 字节
  • 带有愚蠢编写器的代码StupidLogEntry:总时间 = 0.74 秒,总分配 = 600,060,408 字节(注意:实际时间远大于 0.74 秒...)
  • 具有真实编写器的代码LogEntry:总时间 = 5.03 秒,总分配 = 1,920,060,624 字节

这是代码(您可以根据要使用的运行进行评论):

{-# LANGUAGE ScopedTypeVariables #-}
module Main where

--- It depends on the transformers, containers, and base packages.

--- You can profile it with:
--- $ cabal v2-run --enable-profiling debug -- +RTS -p
--- and a file debug.prof …
Run Code Online (Sandbox Code Playgroud)

performance haskell writer

5
推荐指数
1
解决办法
264
查看次数

Pandoc:将文档标题设置为第一个标题

我正在 github 上创建一个库,所以我为此使用了一个 Markdown 文件,其结构如下:

# My main title
## My first section
...
## My second section
...
Run Code Online (Sandbox Code Playgroud)

但不幸的是,当我使用 pandoc 将此文档转换为 Latex 时:

pandoc README.md --number-sections -f markdown -t latex -s -o doc.tex
Run Code Online (Sandbox Code Playgroud)

文档没有任何标题,编号从主标题开始:

1. My main title
1.1. My first section
...
1.2. My second section
...
Run Code Online (Sandbox Code Playgroud)

虽然我想要类似的东西

My main title <=== document title
1. My first section
...
2. My second section
...
Run Code Online (Sandbox Code Playgroud)

我当然可以使用 sed 将所有 ## 更改为 #,并将主标题替换为,% Document My main title但对我来说它看起来很脏。什么是继续的好方法?

谢谢!

markdown latex github pandoc

3
推荐指数
2
解决办法
1955
查看次数

Vue 3:for 循环中的组件 `:is` 失败

我正在尝试循环遍历由字符串描述的组件列表(我从另一个 获取组件的名称,例如const componentTreeName = ["CompA", "CompA"].

我的代码很简单:

<script setup>
    import CompA from './CompA.vue'
    import { ref } from 'vue'

    // I do NOT want to use [CompA, CompA] because my inputs are strings
    const componentTreeName = ["CompA", "CompA"]
</script>

<template>
  <h1>Demo</h1>
  <template v-for="compName in componentTreeName">
    <component :is="compName"></component>
  </template>
</template>
Run Code Online (Sandbox Code Playgroud)

演示在这里

编辑

我尝试但没有取得多大成功。

vue.js vuejs3

2
推荐指数
2
解决办法
2118
查看次数