我正在寻找书本和资源来教自己线性代数用于3D图形编程.我更喜欢教学而不是理论的实用方法(即使数学是99.99%的理论?),所以我的梦想资源将是一本解决线性代数的书,因为它从实际角度用于3D图形编程.
所以我正在玩无堆栈的python,编写一个非常简单的网络服务器来教我自己用微线程/ tasklet编程.但现在我的问题是,当我ab -n 100000 -c 50 http://192.168.0.192/在apache工作台运行类似(100k请求,50并发)的东西时,我得到类似6k req/s的东西,第二次运行它我得到5.5k,第三次5k,第四次,4.5k等等一直到100req/s或者其他东西.
但是,当我重新启动python脚本时问题就消失了.
现在我的问题是为什么?我忘记删除tasklets了吗?我已经检查了stackless.getruncount()(由于某种原因它似乎总是返回1)所以它似乎不会有任何死的tasklet挂在身边?我试过在所有完成的tasklet上调用.kill(),没有帮助.我只是想不出这个.
import socket
import select
import stackless
import time
class socket_wrapper(object):
def __init__(self, sock, sockets):
super(socket_wrapper, self).__init__()
self.sock = sock
self.fileno = sock.fileno
self.sockets_list = sockets
self.channel = stackless.channel()
self.writable = False
self.error = False
def remove(self):
self.sock.close()
self.sockets_list.remove(self)
def send(self, data):
self.sock.send(data)
def push(self, bytes):
self.channel.send(self.sock.recv(bytes))
def stackless_accept(accept, handler, recv_size=1024, timeout=0):
sockets = [accept]
while True:
read, write, error = select.select(sockets, sockets, sockets, timeout)
for sock …Run Code Online (Sandbox Code Playgroud) 拿这个示例代码(暂时忽略它非常低效)
let listToString (lst:list<'a>) = ;;' prettify fix
let rec inner (lst:list<'a>) buffer = ;;' prettify fix
match List.length lst with
| 0 -> buffer
| _ -> inner (List.tl lst) (buffer + ((List.hd lst).ToString()))
inner lst ""
Run Code Online (Sandbox Code Playgroud)
这是我在F#中经常遇到的一种常见模式,我需要有一个内部函数,它可以通过一些值来自我修复 - 我只需要这个函数一次,是否有任何可能从内部调用lambda(一些魔术关键词或什么)?我希望代码看起来像这样:
let listToString2 (lst:list<'a>) = ;;' prettify fix
( fun
(lst:list<'a>) buffer -> match List.length lst with ;;' prettify fix
| 0 -> buffer
| _ -> ##RECURSE## (List.tl lst) (buffer + ((List.hd lst).ToString()))
) lst ""
Run Code Online (Sandbox Code Playgroud)
但正如您可能预期的那样,无法在其自身内部引用匿名函数,这在我放置## RECURSE ##时需要
recursion lambda f# functional-programming fixpoint-combinators
假设64位整数0x000000000000FFFF表示为
00000000 00000000 00000000 00000000
00000000 00000000 >11111111 11111111
Run Code Online (Sandbox Code Playgroud)
如何找到最重要的设置位(标有>的那个)左侧的未设置位数?
我从一个我知道存在的对象的公共字段读取值时抛出了一个令人难以置信的奇怪的NullReferenceException.基本流程如下:
编辑:我意识到我忘记提到一些重要的事情,每次我尝试读取Tag值时都不会发生这种情况,但只有somtimes,足以让我每次都可以通过运行代码重现它,但代码运行时不会立即重现
Tag消息对象上的字段 (工作线程)Tag消息的字段以获取连接,这有时会返回null并抛出异常,但是当抛出异常并检查Message对象时,我可以看到Connection对象(该Tag字段中的对象)那天清楚(主线程)如果你看一下这张照片,你会看到它清晰的日子:

您可以看到我用绿色框标记的位置,我尝试以message.Tag三种不同的方式读取属性,它们都返回null,因为您可以在标有蓝色框的部分中看到.
但是,如果您查看标记为红色的两个区域,您可以看到该对象实际存在的日期.并且,为了清除任何混淆,消息放在收到的消息队列中的部分如下所示:
我可以看到我甚至尝试使用Thread.VolatileWrite来确保写入值
message.Tag = buffer.Tag;
Thread.VolatileWrite(ref message.Tag, buffer.Tag);
if (message.Tag == null)
{
isNullLog.Add(message.Id);
}
// Queue into received messages
lock (peer.ReceivedMessages)
{
peer.ReceivedMessages.Enqueue(message);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码片段都发生在工作线程中,正如你所看到的,我将其复制buffer.Tag到message.Tag,我甚至设置了一个运行时检查调试,检查是否message.Tag为空值并将其id添加到名为"isNullLog"的列表中情况也是如此.在主线程中抛出NullReferenceException时,此列表为空.
您还看到我在设置字段后锁定peer.ReceivedMessages队列并将消息推送到队列.message.Tag
此外,这里更清楚的是用于从peer.ReceivedMessages队列中读出消息的函数:
public bool TryGetMessage(out TIncomingMessage message)
{
lock (ReceivedMessages) …Run Code Online (Sandbox Code Playgroud) 我在寻找一个好的拐点(或好,可以把复数变成单数,反之亦然库 - 这是一种拐点的)库PHP,也可能是一些当前框架的一部分或者一个独立的库的唯一我要求的是它与MIT许可证兼容.
我在使用.NET中的Random类时遇到问题,我正在实现一个工作正常的线程集合,除了一个较小的细节.该集合是一个Skip列表,熟悉它的人知道,对于插入的每个节点,我需要生成一个新的高度,这是<= CurrentMaxHeight+1我用来做这个的代码(我知道这是非常低效的,但它的工作原理)这是我现在的主要优先事项)
int randomLevel()
{
int height = 1;
while(rnd.NextDouble() >= 0.5 && height < MaxHeight)
++height;
return height;
}
Run Code Online (Sandbox Code Playgroud)
我的问题在于,有时候我连续几千个元素只能从这里获得一次,这会杀死跳过列表的性能.10.000个元素连续生成这个方法只有1个的机会,看起来非常渺茫(非常一致).
所以我假设(猜测)Random对象在某种程度上存在问题,但我真的不知道从哪里开始挖掘.所以我转向stackoverflow看看是否有人有想法?
编辑
rnd-variable在类中声明SkipList<T>,并且可以从多个线程访问(每个线程调用集合上的.Add和Add调用.randomLevel)
我需要将一段时间内(例如 24 小时)ASP.NET 应用程序中的所有方法调用跟踪到日志文件中。正在寻找允许我执行此操作的工具?我有兴趣得到这样的东西:
2009-10-12T13:00:41 MyClass.MyMethod("arg1.toString()", "arg2.toString()")
... other nested calls inside this method ...
2009-10-12T13:00:42 MyClass.MyMethod() 0.2312 seconds
Run Code Online (Sandbox Code Playgroud)
基本上是一种查看每个方法调用花费多长时间以及获得什么输入的方法。
简化了问题,以更清楚地表达我实际要求的内容
我有两个线程,叫他们A和B.它们共享一个类型的对象,Foo该对象具有一个被调用的字段Name,并存储Foo[]在索引处的类型数组中0.线程将始终0按照系统保证的顺序访问索引,因此线程B之前没有线程获取的竞争条件A.
顺序是这样的.
// Thread A
array[0].Name = "Jason";
// Thread B
string theName = array[0].Name
Run Code Online (Sandbox Code Playgroud)
正如我所说,这个顺序已经得到保证,线程B无法在线程A之前读取该值
我想要确保的是两件事:
B始终在.Name字段中获取最新值 标记Name为易失性不是一种选择,因为真实对象要复杂得多,甚至还有自定义结构甚至不能附加volatile属性.
现在,满足1很容易(总是得到最新的对象),你可以做一个.VolatileRead:
// Thread A
Foo obj = (Foo)Thread.VolatileRead(ref array[0]);
obj.Name = "Jason";
// Thread B
Foo obj = (Foo)Thread.VolatileRead(ref array[0]);
string theName = obj.Name
Run Code Online (Sandbox Code Playgroud)
或者您可以插入内存屏障:
// Thread A
array[0].Name = "Jason";
Thread.MemoryBarrier();
// Thread B
Thread.MemoryBarrier(); …Run Code Online (Sandbox Code Playgroud) 我已经用F#开发了Unity3D游戏引擎的商业扩展,它是一段代码,使用高级节点/图形编辑功能扩展了编辑器。由于不变性和DU的性质,F#非常适合此操作。
但是,我的问题是:我意识到Microsoft .NET / Visual Studio附带的FSharp.Core.dll的许可证可能不允许您通过商业项目重新分发它?我将如何确定是否存在这种情况,如果不是,则没有办法创建自己的可在Unity3D上运行的FSharp.Core.dll编译版本?
我问的原因是因为Unity3D在后台使用了Mono 2.6(据我了解是经过修改的版本),并且编辑器没有捆绑FSharp.Core.dll,所以我需要为自己提供扩展名。
c# ×5
.net ×3
f# ×2
mono ×2
64-bit ×1
algebra ×1
asp.net ×1
c ×1
c++ ×1
collections ×1
debugging ×1
frameworks ×1
inflection ×1
io ×1
lambda ×1
math ×1
networking ×1
performance ×1
php ×1
python ×1
recursion ×1
trace ×1
windows ×1