我已经在多个地方读过Linux的默认调度程序在多核机器上的超线程感知,这意味着如果你有一台具有2个真实内核(4 HT)的机器,它将不会以某种方式将两个忙线程安排到逻辑内核上它们都运行在相同的物理内核上(在许多情况下会导致2倍的性能成本).
但是当我stress -c 2在我的Intel i5-2520M上运行(产生两个线程以在100%CPU上运行)时,它经常将两个线程调度(并保持)到HT核心1和2上,这些核心映射到相同的物理核心.即使系统处于空闲状态.
这也适用于真正的程序(我在stress这里使用它因为它很容易重现),当发生这种情况时,我的程序可以理解地需要两倍的时间来运行.手动设置亲和力与taskset我的程序的修复程序,但我希望HT感知调度程序自己正确地执行此操作.
您可以找到HT->物理核心配置egrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g'.
所以我的问题是:为什么调度程序将我的线程放在同一个物理内核上?
笔记:
stress -c),并想知道原因.taskset工具或sched_setaffinity函数.这不是我正在寻找的,我希望调度程序能够自己知道将两个忙线程映射到物理核心并将一个物理核心完全留空并不是一个好主意.stress受益于在不同的物理核心上运行.我希望介绍用Haskell编写的程序.
在编译时,我被告知我没有为某些依赖项(例如criterion)安装和cabal中止分析库.
我没有兴趣分析这些依赖项的部分内容; 调用的代码main甚至不使用它们.
如何在不安装我不需要的分析库的情况下分析我的应用程序,并且不删除所有这些依赖项?
为了比较性能与GHC bug中缓慢的列表, 我试图尽可能快地得到以下循环:
{-# LANGUAGE BangPatterns #-}
module Main (main) where
import Control.Monad
import Data.Word
main :: IO ()
main = do
loop (maxBound :: Word32) $ \i -> do
when (i `rem` 100000000 == 0) $
print (fromIntegral i / fromIntegral (maxBound :: Word32))
loop :: Word32 -> (Word32 -> IO ()) -> IO ()
loop n f = go 0
where
go !i | i == n = return ()
go !i = f i >> …Run Code Online (Sandbox Code Playgroud) 我想将完整的日期/时间转换为像ISO 一样的new Date().toISOString() ISO 8601格式,给出一种YYYY-MM-DDTHH:mm:ss.sssZ格式.
我找不到基本库函数或包来执行此操作.
我有一个Haskell数据类型
data Mytype
= C1
| C2 Char
| C3 Int String
Run Code Online (Sandbox Code Playgroud)
如果我case在a Mytype并忘记处理其中一个案例,GHC会给我一个警告(详尽检查).
我现在想编写一个QuickCheck Arbitrary实例来生成MyTypes如下:
instance Arbitrary Mytype where
arbitrary = do
n <- choose (1, 3 :: Int)
case n of
1 -> C1
2 -> C2 <$> arbitrary
3 -> C3 <$> arbitrary <*> someCustomGen
Run Code Online (Sandbox Code Playgroud)
这个问题是我可以添加一个新的替代方案Mytype并忘记更新Arbitrary实例,因此让我的测试不测试该替代方案.
我想找到一种方法来使用GHC的详尽检查器来提醒我在我的任意实例中被遗忘的案例.
我想出的最好的是
arbitrary = do
x <- elements [C1, C2 undefined, C3 undefined undefined]
case x of
C1 -> C1
C2 …Run Code Online (Sandbox Code Playgroud) 我现在惊叹于此:
C++ 11
#include <iostream>
#include <iomanip>
#include <limits>
int main()
{
double d = 1.305195828773568;
std::cout << std::setprecision(std::numeric_limits<double>::max_digits10) << d << std::endl;
// Prints 1.3051958287735681
}
Run Code Online (Sandbox Code Playgroud)
蟒蛇
>>> repr(1.305195828773568)
'1.305195828773568'
Run Code Online (Sandbox Code Playgroud)
发生了什么,为什么C++中的额外1?
到目前为止,我认为C++和Python使用相同的64位IEEE双打; 两个格式化函数都应该打印完整的精度.
当cabal build我的项目,警告(尤其是-Wall)仅在第一次显示.
在后续构建中,所有内容都被缓存.
我想再次看到我项目的所有警告.
我可以cabal clean和重新编译或使用cabal build --ghc-options="-fforce-recomp",但只是时间太长.
如何尽快进行警告检查?
什么是转换Storable.Vector Word8和严格的最佳方式ByteString?
当然,非常感谢非复制(无操作)方式.
我应该只是unsafeCoerce或者是否有一个库函数(我找不到)?
此外,方法是否相同Unboxed.Vector Word8?
如何禁用GC,或大大降低GC的频率?
就像给它+RTS一些巨大的堆或分配大小的选项可能?
我希望看到我的程序在没有GC发生时的行为.
可以说我有这个程序
{-# LANGUAGE GADTs #-}
data My a where
A :: Int -> My Int
B :: Char -> My Char
main :: IO ()
main = do
let x = undefined :: My a
case x of
A v -> print v
-- print x
Run Code Online (Sandbox Code Playgroud)
编译好.
但当我评论时print x,我得到:
gadt.hs: line 13, column 12:
Couldn't match type ‘a0’ with ‘()’
‘a0’ is untouchable
inside the constraints (a1 ~ GHC.Types.Int)
bound by a pattern with constructor
Main.A :: GHC.Types.Int …Run Code Online (Sandbox Code Playgroud)