在Stack Overflow上有很多关于AOP in .NET的问题和解答,经常提到PostSharp和其他第三方产品.因此,在.NET和C#世界中似乎有相当多的AOP选项.但是每个都有它们的限制,在下载了有希望的PostSharp之后我在他们的文档中发现'方法必须是虚拟的'才能注入代码(编辑:请参阅ChrisWue的答案和我的评论 - 虚拟约束必须有我猜想,他是其中一个竞争者.我还没有进一步调查这个陈述的准确性,但是它的分类让我回到Stack Overflow.
所以我想回答这个非常具体的问题:
我想在我的项目中没有自定义的每个方法和属性(静态,密封,内部,虚拟,非虚拟,无关紧要)注入简单的 "if(some-condition)Console.WriteLine"样式代码注释,以便在运行时动态测试我的软件.这个注入的代码不应该保留在发布版本中,它只是用于在开发期间进行动态测试(与线程相关).
最简单的方法是什么?我偶然发现Mono.Cecil,它看起来很理想,除了你似乎必须编写你要在IL中注入的代码.这不是一个大问题,使用Mono.Cecil很容易获得用C#编写的IL版本的代码.但是,如果有更简单的东西,理想情况下甚至可以内置到.NET中(我仍然在.NET 3.5上),我想知道.[更新:如果建议的工具不是.NET Framework的一部分,那么如果它是开源的,如Mono.Cecil,或者免费提供,那就太好了]
我们的应用程序通过ClickOnce分发,平均需要10.8秒才能启动.在ngen.exe上运行后(在ClickOnce安装它的目录中),平均启动时间为6.4秒.这显然是一个巨大的加速(40%),如果可能的话我想利用ngen-ification.
Ron的回答是否有可能将NGen用于ClickOnce部署?显示如何在客户的机器上完成它,假设我猜他运行的是Windows XP,因为它想要我的Windows 7机箱上的管理员权限,所以这似乎不是一般的解决方案.
此外,ngen 在我的盒子上花了40秒来编译属于该应用程序的所有程序集.
理想情况下,我希望将所有(主要)架构的应用程序作为构建过程的一部分,因此可以将其发送给客户,而无需用户接受"可以作为管理员执行".弹出然后等待40秒.
那可能吗?
时不时地,我认为这将是很好用clojure的shell脚本,但大约900毫秒的启动时间太慢.然后我会google startpage for"nailgun clojure",但唯一显示的结果是针对vimclojure这样的特殊情况.那时我假装没有时间,转向awk更快启动的更多病房语言.
那么,怎样才能nailgun加快clojure的启动时间呢?
我在ConcurrentDictionary中寻找一个方法,允许我按键删除一个条目,当且仅当该值等于我指定的值时,类似于TryUpdate,但是对于删除.
执行此操作的唯一方法似乎是此方法:
ICollection<KeyValuePair<K, V>>.Remove(KeyValuePair<K, V> keyValuePair)
Run Code Online (Sandbox Code Playgroud)
它是ICollection接口的显式实现,换句话说,我必须首先将ConcurrentDictionary转换为ICollection,以便我可以调用Remove.
删除完全符合我的要求,并且该投射也没什么大不了的,源代码也显示它调用私有方法TryRemovalInternal与bool matchValue = true,所以它看起来都很漂亮和干净.
然而,令我担心的是,它没有被记录为ConcurrentDictionary的乐观并发Remove方法,因此http://msdn.microsoft.com/en-us/library/dd287153.aspx只是重复ICollection样板,并且该如何从一个ConcurrentDictionary添加和删除的项目并不要么提到的方法.
有谁知道这是否可行,或者是否有其他方法我缺席?
我想将元数据的键值对添加到任意JavaScript对象.此元数据不应影响不了解元数据的代码,例如,这意味着
JSON.stringify(obj) === JSON.stringify(obj.WithMetaData('key', 'value'))
Run Code Online (Sandbox Code Playgroud)
元数据感知代码应该能够通过密钥检索数据,即
obj.WithMetaData('key', 'value').GetMetaData('key') === 'value'
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点 - 在node.js?如果是这样,它是否适用于内置类型String ,甚至是?(编辑思考它,我不关心像数字这样的真实原语,但是对于字符串实例来说这很好).Number
一些背景:我要做的是缓存从具有对象本身的对象派生的值,以便这样做
另一种方法是在某处存储带有缓存的哈希表,但是你永远不知道对象何时被垃圾收集.必须手动处理每个对象实例,以便缓存不会泄漏.
(btw clojure有这个功能:http://clojure.org/metadata)
在 C# 中是否有一种简单、高效和正确(即不涉及到/从 double 转换)的方法来进行地板整数除法(例如Python 提供)。
换句话说,以下的有效版本,不会遭受长/双转换损失。
(long)(Math.Floor((double) a / b))
Run Code Online (Sandbox Code Playgroud)
还是必须自己实现它,例如
static long FlooredIntDiv(long a, long b)
{
if (a < 0)
{
if (b > 0)
return (a - b + 1) / b;
// if (a == long.MinValue && b == -1) // see *) below
// throw new OverflowException();
}
else if (a > 0)
{
if (b < 0)
return (a - b - 1) / b;
}
return a / …Run Code Online (Sandbox Code Playgroud) 如果我有一个字节数组,并且想要将该数组的连续 16 字节块(包含 .net 的Decimal, 表示形式)转换为正确的Decimal结构,那么最有效的方法是什么?
在我正在优化的情况下,以下代码在我的分析器中显示为最大的 CPU 消耗者。
public static decimal ByteArrayToDecimal(byte[] src, int offset)
{
using (MemoryStream stream = new MemoryStream(src))
{
stream.Position = offset;
using (BinaryReader reader = new BinaryReader(stream))
return reader.ReadDecimal();
}
}
Run Code Online (Sandbox Code Playgroud)
为了摆脱MemoryStreamand ,我认为将sBinaryReader数组输入到构造函数中会比我下面介绍的解决方案更快,但奇怪的是,下面的版本快了一倍。BitConverter.ToInt32(src, offset + x)Decimal(Int32[])
const byte DecimalSignBit = 128;
public static decimal ByteArrayToDecimal(byte[] src, int offset)
{
return new decimal(
BitConverter.ToInt32(src, offset),
BitConverter.ToInt32(src, offset + 4),
BitConverter.ToInt32(src, offset + 8),
src[offset + …Run Code Online (Sandbox Code Playgroud) Windows 8 和 Server 2012 支持RIO,它允许您预先注册 I/O 缓冲区一次,然后重复使用这些相同的缓冲区,从而避免其他(显然)必要的每个 I/O 操作缓冲区检查。
RIO 还允许完全在用户模式下完成诸如轮询之类的完成操作,而无需进行系统调用。
(如何)这在 Linux/Unix 上是可能的吗?
Kafka 对于分区返回 endOffset 15,但可以使用的最后一条消息的偏移量为 13,而不是我期望的 14。我想知道为什么。
卡夫卡文档阅读
在默认的read_uncommissed隔离级别下,结束偏移量是高水位线(即最后成功复制的消息的偏移量加一)。对于read_commited消费者来说,结束偏移量是最后一个稳定偏移量(LSO),它是高水位线的最小值和任何打开事务的最小偏移量。
这是 kafkacat 的输出。我使用 kafkacat,因为它可以打印消息偏移量:
$ kafkacat -Ce -p0 -tTK -f'offset: %o key: %k\n'
offset: 0 key: 0108
offset: 1 key: 0253
offset: 4 key: 0278
offset: 5 key: 0198
offset: 8 key: 0278
offset: 9 key: 0210
offset: 10 key: 0253
offset: 11 key: 1058
offset: 12 key: 0141
offset: 13 key: 1141
% Reached end of topic TK [0] at offset 15: exiting
Run Code Online (Sandbox Code Playgroud)
同样令人困惑的是——而且很可能是相关的——偏移量不是连续的,尽管我还没有设置压缩等。
更多细节:
$ kafka-topics.sh --bootstrap-server localhost:9092 …Run Code Online (Sandbox Code Playgroud) 如果键不在列表中,SortedList<TKey, TValue>.IndexOfKey(key)返回 -1 。
这是否意味着如果我想在列表中找到大于或等于key的键的索引,我必须自己实现二进制搜索?还是我忽略了一些开箱即用的东西?
我当然想得到 O(log(n)) 的结果,所以请不要使用 LINQ 迭代和过滤魔法。
(一般来说,我想要像 Java 的 NavigableMap 功能,即在排序的地图/字典上进行高效迭代等功能,但就目前而言,上述问题的答案就足够了,我可以按照自己的方式“扩展方法”从那里以某种方式)