小编use*_*324的帖子

使用Scotty的网络I/O的吞吐量意外低

我试图对Scotty进行测试,以测试网络I/O效率和整体吞吐量.

为此,我设置了两个用Haskell编写的本地服务器.一个不做任何事情而只是充当API的人.

代码相同

{-# LANGUAGE OverloadedStrings #-}


import Web.Scotty

import Network.Wai.Middleware.RequestLogger 

import Control.Monad
import Data.Text
import Control.Monad.Trans
import Data.ByteString
import Network.HTTP.Types (status302)
import Data.Time.Clock
import Data.Text.Lazy.Encoding (decodeUtf8)
import Control.Concurrent
import Network.HTTP.Conduit
import Network.Connection (TLSSettings (..))
import Network.HTTP.Client
import Network
main = do 
  scotty 4001 $ do
    middleware logStdoutDev
    get "/dummy_api" $ do
        text $ "dummy response"
Run Code Online (Sandbox Code Playgroud)

我写了另一个调用此服务器并返回响应的服务器.

{-# LANGUAGE OverloadedStrings #-}


import Web.Scotty

import Network.Wai.Middleware.RequestLogger 

import Control.Monad
import Control.Monad.Trans
import qualified Data.Text.Internal.Lazy as LT
import Data.ByteString
import Network.HTTP.Types (status302)
import …
Run Code Online (Sandbox Code Playgroud)

benchmarking haskell http-conduit scotty

16
推荐指数
1
解决办法
334
查看次数

使用Template Haskell生成函数

是否可以使用Template Haskell定义函数?例如

convertStringToValue :: String -> Int
convertStringToValue "three" = 3
convertStringToValue "four" = 4
Run Code Online (Sandbox Code Playgroud)

我也有Map [Char] Int.

fromList [("five",5),("six",6)]
Run Code Online (Sandbox Code Playgroud)

我该如何添加功能

convertStringToValue "six" = 6
convertStringToValue "five" = 5
Run Code Online (Sandbox Code Playgroud)

在编译时使用Template Haskell和Map?使用Template Haskell来达到这个目的似乎很愚蠢,但我还是想知道.

haskell template-haskell

10
推荐指数
1
解决办法
574
查看次数

将其他属性添加到现有文档elasticsearch

如何在Elasticsearch索引中向现有文档添加其他属性.

$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elastic Search"
}'
Run Code Online (Sandbox Code Playgroud)

这将在索引中创建一个文档.如何向文档添加属性?假设

"new_attribute":"new_value"
Run Code Online (Sandbox Code Playgroud)

这会将文件修改为

"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elastic Search"
"new_attribute" :"new_value"
Run Code Online (Sandbox Code Playgroud)

indexing document updating elasticsearch

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

GHC每线程GC策略

我有一个Scotty api服务器,它构造一个Elasticsearch查询,从ES获取结果并呈现json.

与凤凰城和杜松子酒等其他服务器相比,我通过使用BloodHound获得更高的CPU利用率和吞吐量来提供ES响应,但是Gin和Phoenix在内存效率方面比Scotty更好.

Scotty的统计数据

 wrk -t30 -c100 -d30s "http://localhost:3000/filters?apid=1&hfa=true"
Running 30s test @ http://localhost:3000/filters?apid=1&hfa=true
  30 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   192.04ms  305.45ms   1.95s    83.06%
    Req/Sec   133.42    118.21     1.37k    75.54%
  68669 requests in 30.10s, 19.97MB read
Requests/sec:   2281.51
Transfer/sec:    679.28KB
Run Code Online (Sandbox Code Playgroud)

这些统计数据在我的Mac上安装了GHC 7.10.1

处理器信息2.5GHx i5
内存信息8GB 1600 Mhz DDR3

基于轻量级线程的GHC并发性让我印象深刻,但内存效率仍然是一个大问题.

分析内存使用情况产生了以下统计数据

    39,222,354,072 bytes allocated in the …
Run Code Online (Sandbox Code Playgroud)

memory multithreading garbage-collection haskell ghc

7
推荐指数
1
解决办法
340
查看次数

在PostgreSQL中使用json数组中的索引

参考原始的stackoverflow问题,我试图将金币索引应用于Postgres 9.4中数组对象中的键,但我没有得到第一个答案中所述的结果.

你能否解决这个错误?

我遵循的步骤如下.

第1部分:创建表和索引

CREATE TABLE tracks (id serial, artists jsonb);
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists);
INSERT INTO tracks (id, artists) VALUES (1, '[{"name": "blink-182"}]');
INSERT INTO tracks (id, artists) VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');
Run Code Online (Sandbox Code Playgroud)

第2部分:查询

SELECT * FROM tracks WHERE artists @> '{"name": "The Dirty Heads"}';
 id | artists 
----+---------
(0 rows)
Run Code Online (Sandbox Code Playgroud)

此查询提供空结果.
我也尝试使用jsonb_path_opsGIN索引.

替代索引和查询:

DROP INDEX tracks_artists_gin_idx;
CREATE INDEX tracks_artistnames_gin_idx ON tracks USING  gin (artists jsonb_path_ops); …
Run Code Online (Sandbox Code Playgroud)

sql arrays postgresql indexing jsonb

4
推荐指数
1
解决办法
3136
查看次数

删除haskell语句中的括号

我正在尝试使用折叠和追加字节串操作.请参阅下面的代码.

import qualified Data.ByteString.Char8 as C

selectSource :: [String] -> C.ByteString
selectSource xs = C.append (foldl addSource emptySource xs) (C.pack "<head>")
Run Code Online (Sandbox Code Playgroud)

addSource并相应emptySource地定义.用括号看起来有点难看,我想在selectSource函数中删除它们

C.append $ foldl addSource emptySource xs $ C.pack "<head>"
Run Code Online (Sandbox Code Playgroud)

但没有这样做,并得到一个错误消息说

Couldn't match expected type ‘C.ByteString -> C.ByteString’
            with actual type ‘C.ByteString’
The first argument of ($) takes one argument,
but its type ‘SourceByteString’ has none
In the second argument of ‘($)’, namely
  ‘foldl addSource emptySource [] $ C.pack "<head>"’
Run Code Online (Sandbox Code Playgroud)

这有效

C.append (foldl addSource …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming parentheses

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