我已经仔细查看了剖析的解释,但我没有看到直接了解哪些数据类型被垃圾收集最多的方法.有没有办法做到这一点?
我们的一些代码在垃圾收集器中运行了50%甚至80%,因此......试图追踪正在使用的数据类型.
换句话说,我们可以有效地在持久数据结构中建模多对多关系吗?
建议使用一对单向多图.但是,我不确定这对于在持久数据结构中删除是否会很好.让我们假设我们将键1..4设置为值"1".."4"并且假设它们各自引用所有其他的,所以我们有两个看起来非常相似的两个方向的地图:
{1 => ["2","3","4"],2 => ["1","3","4"],...} {"1"=> [2,3, 4],"2"=> [1,3,4],...}
现在我们想要从系统中完全删除第1项.这需要更改第一个映射中的一个节点,但它需要在第二个映射中更改n-1个节点.对于成千上万的n(可能在我考虑这个的情况下)不会那么贵吗?或者是针对处理此类更改而优化的多图?这是一个病态案例,但仍然......
四叉树似乎是一个迷人的想法.我要多考虑一下.
persistence functional-programming immutability referential-transparency data-structures
我正在两个模型之间构建API.我不在乎它是否返回[]或Seq或任何可折叠的东西都没问题.但如果我尝试这样做,我会收到错误.
module Main where
import Prelude hiding (foldr)
import Data.Foldable
import Data.Sequence
data Struct = Struct
main = do
print $ foldr (+) 0 $ list Struct
print $ foldr (+) 0 $ listFree Struct
listFree :: Foldable f => a -> f Int
listFree s = singleton 10
class TestClass a where
list :: Foldable f => a -> f Int
instance TestClass Struct where
list s = singleton 10
Run Code Online (Sandbox Code Playgroud)
listFree和列表定义都给出了相同的错误:
TestFoldable.hs:19:12:
Could not deduce (f ~ [])
from …Run Code Online (Sandbox Code Playgroud) 我有以下代码使用GHC API加载模块并获取表达式的类型:
typeObjects :: [String] -> [String] -> IO [Type]
typeObjects modules objects = do
defaultErrorHandler defaultDynFlags $ do
runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
targets <- mapM ((flip guessTarget) Nothing) modules
setTargets targets
result <- load LoadAllTargets
case result of
Failed -> error "Compilation failed"
Succeeded -> do
m <- mapM (((flip findModule) Nothing) . mkModuleName) modules
setContext m []
values <- mapM exprType objects
return values
Run Code Online (Sandbox Code Playgroud)
如果表达式没有进行类型检查,则整个程序崩溃:
TestDynamicLoad: panic! (the 'impossible' happened)
(GHC version …Run Code Online (Sandbox Code Playgroud) eclipse编译器及其API与JDK中包含的一个相比具有一些显着优势(特别有益于我的应用程序),所以我想使用它.我有一个独立的实用程序,我想最小化其大小和依赖项.
有什么方法可以访问eclipse编译器(最小的jar文件集和下载位置)并在内存中动态编译生成的代码?
似乎不可能对函数和数据类型等类型类约束进行内省.然而,ghci似乎做到了.
Prelude> :t show
show :: (Show a) => a -> String
Run Code Online (Sandbox Code Playgroud)
所以...不知怎的,它知道类型类约束,因为它打印出来.它是怎么做到的?
我理解树通常用于修改持久数据结构(创建一个新节点并替换它的所有祖先).
但是,如果我有一个10,000个节点的树,我需要修改1000个节点呢?我不想通过创建1000个新根,我只需要一次修改所有内容所产生的新根.
例如:让我们以持久二进制树为例.在单个更新节点的情况下,它会进行搜索,直到找到节点,创建带有修改的新节点和旧子节点,并创建直到根节点的新祖先.
在批量更新的情况下,我们可以这样做:您不仅要更新单个节点,而且要在一次通过中更新1000个节点.
在根节点,当前列表是完整列表.然后,您可以在与左节点匹配的列表和与右侧节点匹配的列表之间拆分该列表.如果没有一个孩子匹配,不要下降到它.然后,您下降到左侧节点(假设存在匹配项),将其搜索列表拆分为其子节点,然后继续.如果您有一个节点和一个匹配项,则更新它并重新启动,替换和更新祖先和其他分支.
即使修改了任意数量的节点,这也只会产生一个新根.
我有多个线程处理事件.我想为每个事件分配一个纳秒时间戳.但它必须是一个独特的id.因此,在奇怪的情况下,两个事件到达使得它们将被分配相同的时间戳,我希望其中一个增加一纳秒.鉴于实际精度不在纳秒级别,就系统的时间戳性质而言,这是可以的.
在一个帖子中,这是一个微不足道的问题.但是跨越多个线程,它变得更具挑战性.性能是绝对关键的,所以天真地同步典型的id生成器类型的东西的想法似乎会阻止太多.
是否有一些方法可以解决这个问题,只需要很少锁定或不锁定?
是否存在一种已经存在的直接方式来保持JavaFX GUI状态,包括为节点的userData字段进行自定义(反)序列化?
如果您观看以下测试,您会看到所有圆圈都移动而不是仅添加新圆圈.它不会每次都发生.我认为只有当新生儿超出现有范围时才会这样.但是我如何得到它以便当我添加另一个圆圈时它不会移动群组及其所有孩子,无论我在哪里放置圆圈?
请注意,如果我没有在集团上设置比例,他们就不会全部移动.所以它与设置比例有关.
import javafx.application.*;
import javafx.beans.value.*;
import javafx.collections.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.shape.*;
import javafx.stage.*;
import java.util.*;
public class GroupTest extends Application {
public static void main(String[] args) {
launch(args);
}
public void start(Stage stage) {
Pane pane = new Pane();
Group root = new Group();
// NOTE: removing these two setScale* lines stops the undesirable behavior
root.setScaleX(.2);
root.setScaleY(.2);
root.setTranslateX(100);
root.setTranslateY(100);
root.layoutXProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
System.out.println("root layout: " …Run Code Online (Sandbox Code Playgroud) haskell ×5
immutability ×2
java ×2
javafx-2 ×2
persistence ×2
eclipse ×1
ghc-api ×1
ghci ×1
performance ×1
profiling ×1
typechecking ×1
typeclass ×1