我正在处理代码,该代码将特定协议定义的大量ascii文本作为输入.原作者将原始协议中的"string(1)"数据类型解释为代码中的字符.
在角落的情况下有很多微妙的错误,你有代码,如:
char theChar = whatever();
if(theChar == 7) {...}
Run Code Online (Sandbox Code Playgroud)
真正的意思是:
if(theChar == '7') {...}
Run Code Online (Sandbox Code Playgroud)
为了尝试一次捕获所有这些,有没有办法禁用隐式转换为'char'?如果没有,那么追踪所有这些的最佳方法是什么?
我有一些必须是线程安全的代码,其行为类似于:
protected long m_RunningValue
protected long m_RunningCounter
protected object m_Lock = new object();
public long RunningValue { get { return Interlocked.Read(m_RunningValue); } }
public long RunningCounter { get { return Interlocked.Read(m_RunningCounter); } }
public void DoCalculation(int newValue, int newQuantity)
{
lock(m_Lock)
{
Interlocked.Add(ref m_RunningValueA, newValue);
Interlocked.Add(ref m_RunningCounter, newQuantity);
if(Interlocked.Read(ref newQuantity) == 0)
{
...m_RunningValue gets further modified here
}
}
}
计算必须锁定值和计数器,否则竞争条件可能影响if(...)块,但是在读出时它们根本不需要同步,即如果计数器和值在尝试之间发生变化读两个,这对我来说是100%的好.
读取时的互锁用于读取64位值的线程安全性.
混合联锁和锁这样安全吗?我在其他网页上看到混合它们是不安全的,但是如果这意味着混合它们是引入细微错误的好方法,或者如果在系统级别这会破坏所涉及的数据结构,我无法找到澄清.
所有这些互锁(64位.NET 4.0运行时)的成本是否完全违背了在属性get()方法周围保存ReaderWriterSlim锁的目的?
我正在尝试实施时间服务,报告时间的准确性超过1毫秒.我认为一个简单的解决方案是进行初始测量并使用StopWatch为其添加增量.问题是这种方法似乎与墙壁时间相差很快.例如,以下代码尝试测量Wall Time和我的高分辨率时钟之间的差异:
public static void Main(string[] args)
{
System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
DateTime baseDateTime = DateTime.UtcNow;
s.Start();
long counter = 0;
while(true)
{
DateTime utcnow = DateTime.UtcNow;
DateTime hpcutcnow = baseDateTime + s.Elapsed;
Console.WriteLine(String.Format("{0}) DT:{1} HP:{2} DIFF:{3}",
++counter, utcnow, hpcutcnow, utcnow - hpcutcnow));
Thread.Sleep(1000);
}
}
Run Code Online (Sandbox Code Playgroud)
在相当近期的服务器硬件上,我以大约2毫秒/分钟的速度发散.
窗户中是否还有其他时间设施我不知道会更准确?如果没有,是否有更好的方法来创建我应该使用的高分辨率时钟或第三方库?
我目前正在处理在一个应用程序(C++)中序列化的代码,并需要在另一个应用程序(C#)中反序列化它.我正在尝试使用谷歌proto + protobuf-net,但有些事情失败了.
.cc和.cs消息定义文件都是使用它们各自的编译器从同一个.proto文件生成的.
数据通过UDP发送,消息(~40B)很容易适合单个数据报.
在C++大小上,boost :: asio用于传输数据,相关代码为:
ProtocolBufferdata data;
...
boost::asio::streambuf b;
std::ostream os(&b);
data.SerializeToOstream(&os);
m_Socket.send_to(b.data(), m_Endpoint);
Run Code Online (Sandbox Code Playgroud)
我很确定这是正常的,因为使用wireshark我至少可以看到我期望在数据报中的所有字符串.在C#端,使用Begin/End接收,我们在回调中有以下内容:
byte[] buffer ....
public void ReceiveData(IAsyncResult iar)
{
try
{
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceive(iar);
using (MemoryStream memStream = new MemoryStream())
{
memStream.Write(buffer, 0, recv);
ProtoData data = ProtoBuf.Serializer.Deserialize<ProtoData >(memStream);
onReceive(data);
}
}
catch (Exception ex)
{
...
}
finally
{
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveData), socket);
}
}
Run Code Online (Sandbox Code Playgroud)
缓冲区确实具有预期的字节数,并具有告警字符串.protobuf-net容器具有所有默认值.
我对这里发生的事情感到有些困惑,并且几乎不可能将调试器附加到客户端应用程序,因为它被部署为另一个与远程调试器不兼容的应用程序的插件.我很感激任何建议,这让我很难过.
我目前有一个项目,其中包括大量的外部,需要在外部更新时重建,以保持文物新鲜.只有在分支本身进行更改时,我无法找到在外部更改时触发svn构建的方法.
是否有TeamCity的某些功能可以执行此操作,如果没有,添加此构建触发器的最佳方法是什么?
在查看一些与此问题无关的错误的数据库代码时,我注意到在某些地方List<T>使用不当.特别:
List作为读者,但使用索引到list的,而不是enumerators.list.list,但由于代码结构,在执行返回的方法之前永远不会访问最后一个元素Add().list.通过C#文档,这不应该是线程安全的.但它从未失败过.我想知道,因为具体实施的,List(我在内部假定它是一个数组是重新allocs当它运行的空间),它的1-作家0枚举正阅读器插件唯一的方案偶然线程安全的,或者是否有一些不太可能的情况,这可能会在当前的.NET4实现中爆炸?
编辑:重要细节我遗漏了阅读一些回复.读者将List其内容视为只读.
很久以前(2003年),CLR Performance Team发表了一篇由Jan Gray撰写的文章,名为" 编写更快的托管代码:知道什么是成本 ".在撰写本文之后的十年中,.NET已经增加了许多基本操作; 我确信自从CLR的最初版本发布以来,文章中引用的许多基本操作的性能都发生了变化.
是否有一个很好的参考,已经更新了CLR的最新版本的基本操作的性能测量?
我需要使用标准的“math.h”中点舍入行为将 64 位双精度值舍入到我的代码中最接近的 uint64_t。其中一些数字具有以下属性:
我注意到标准库舍入函数没有“未签名”版本。另外,我怀疑当中间双精度值太大而无法放入尾数时,人们用来执行此操作的一些技巧将不再起作用。
进行这种转换的最佳方法是什么?
我正在开发一个项目,该项目将从后端的列存储数据库中获益.我被LucidDB所吸引,因为功能设置似乎很完美,在项目显示价值之前,我无法承担Infobright或Vertica等商业解决方案的成本.
问题是,我担心LucidDB项目的健康状况.内部维基在一个多月内没有更新,网站上有很多破损的链接.DynamoBI死亡并没有帮助.
是否有人知道项目的状态,以及您对依赖此数据库的生产代码的满意程度如何?
在此文章中,一种技术被描述为在移动的gcc错误代码外的线,以帮助优化尺寸为热路径尽可能。这方面的一个例子是:
#define unlikely(x) __builtin_expect (!!(x), 0)
bool testForTerriblyUnlikelyEdgeCase() {
//test for error condition here
}
void example() {
if (unlikely(testForTerriblyUnlikelyEdgeCase())) {
[&]() __attribute__((noinline,cold)) {
//error handling code here
}();
}
}
Run Code Online (Sandbox Code Playgroud)
这是一项很棒的技术,但需要大量的样板文件。包装它以尽可能减少样板的最佳方法是什么?理想情况下 C++14 兼容允许特定于 gcc 的功能。
额外问题: if 语句中的不太可能(...) 是否多余,因为 lambda 被显式标记为冷?