我遇到了LINQ查询性能的问题,所以我创建了一个简单的小例子来演示下面的问题.该代码采用随机的小整数列表,并将分区列表分成几个较小的列表,每个列表总数为10或更少.
问题是(正如我写的那样)代码用N指数增长.这只是一个O(N)问题.当N = 2500时,代码需要10秒才能在我的电脑上运行.
如果有人能解释发生了什么,我会非常高兴.谢谢,马克.
int N = 250;
Random r = new Random();
var work = Enumerable.Range(1,N).Select(x => r.Next(0, 6)).ToList();
var chunks = new List<List<int>>();
// work.Dump("All the work."); // LINQPad Print
var workEnumerable = work.AsEnumerable();
Stopwatch sw = Stopwatch.StartNew();
while(workEnumerable.Any()) // or .FirstorDefault() != null
{
int soFar = 0;
var chunk = workEnumerable.TakeWhile( x =>
{
soFar += x;
return (soFar <= 10);
}).ToList();
chunks.Add(chunk); // Commented out makes no difference.
workEnumerable = workEnumerable.Skip(chunk.Count); // <== SUSPECT …Run Code Online (Sandbox Code Playgroud) 我遇到了我创建的C++/CLI混合模式DLL的问题.卸载时抛出异常,因为使用它的.NET应用程序退出.在DLL_PROCESS_DETACH执行之后,DLL使用自动注册的atexit() / __onexit()函数执行运行时清理并抛出以下异常:
Unhandled exception at 0x752bb9bc (KernelBase.dll) in psstestm.exe:
0xC0020001: The string binding is invalid.
Run Code Online (Sandbox Code Playgroud)
我已经将问题跟踪到一个atexit()由静态boost异常对象注册的调用get_static_exception_object().
function_to_call 0x0f560410 _t2m@???__Fep@?1???$get_static_exception_object@Ubad_exception_@exception_detail@boost@@@exception_detail@boost@@YA?AVexception_ptr@1@XZ@YAXXZ@?A0x0a546e27@@YAXXZ void (void)*
Run Code Online (Sandbox Code Playgroud)
我使用boost_1_47大部分静态链接,除了boost :: thread,动态链接以避免加载器锁.我也尝试动态链接所有的助手,这没有帮助.所有的升压包括都被#pragma unmanaged块包围.
我希望有人有类似的问题或知道解决方案?
谢谢,马克
这是异常发生之前的调用堆栈:
psscorem.dll!_CRT_INIT(void * hDllHandle=0x0f4b0000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 413 C
psscorem.dll!__DllMainCRTStartup(void * hDllHandle=0x0f4b0000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 526 + 0x11 bytes C
psscorem.dll!_DllMainCRTStartup(void * hDllHandle=0x0f4b0000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 476 + 0x11 bytes …Run Code Online (Sandbox Code Playgroud) 我正在尝试ReadOnlyCollection使用protobuf-net 序列化和反序列化.但是,当protobuf-net尝试将List转换为ReadOnlyCollection时,反序列化时会抛出异常.
var roc = new ReadOnlyCollection<byte>(new byte[] {1, 2, 3});
var ms = new MemoryStream();
Serializer.Serialize(ms, roc);
ms.Position = 0;
var roc2 = Serializer.Deserialize<ReadOnlyCollection<byte>>(ms);
Console.WriteLine( BitConverter.ToString( roc2.ToArray() ) );
Run Code Online (Sandbox Code Playgroud)
有没有办法把它作为一个ReadOnlyCollection而不是序列化/反序列化List?在实际的应用程序中,它ReadOnlyCollection是我想要序列化的不可变对象的一部分,并且宁愿将它保留为ReadOnlyCollection.
我试图在类型T的模板化类中显式实例化类型U的模板化函数.下面的代码生成警告,链接器找不到显式实例化ReinterpretAs().任何人都可以发现错误或建议如何做到这一点?我正在使用VC++ 2010.
template<typename T>
class Matrix
{
public:
template<typename U> Matrix<U> ReinterpretAs() const;
};
template<typename T>
template<typename U>
Matrix<U> Matrix<T>::ReinterpretAs() const
{
Matrix<U> m;
// ...
return m;
}
// Explicit instantiation.
template class Matrix<int>;
template class Matrix<float>;
template Matrix<float> Matrix<int>::ReinterpretAs<float>();
template Matrix<int> Matrix<float>::ReinterpretAs<int>();
Run Code Online (Sandbox Code Playgroud)
上面的最后两行给出了编译器警告:
warning #536: no instance of function template "Matrix<T>::ReinterpretAs
[with T=float]" matches the specified type
Run Code Online (Sandbox Code Playgroud)
马克,提前谢谢你
嗨,我正在使用C++/Boost ASIO,我必须内联ntohl()性能原因.每个数据包包含256个int32,因此有很多调用ntohl().有没有人这样做过?
这是VC10 ++中编译的程序集输出,所有优化都打开:
; int32_t d = boost::asio::detail::socket_ops::network_to_host_long(*pdw++);
mov esi, DWORD PTR _pdw$[esp+64]
mov eax, DWORD PTR [esi]
push eax
call DWORD PTR __imp__ntohl@4
Run Code Online (Sandbox Code Playgroud)
我也试过了ntohl()winsock提供的常规.任何帮助将不胜感激.
另外,我一直在考虑使用#define宏来执行简单的int32桶移位的C方式(如果网络顺序与编译时的机器顺序不匹配).如果有人知道并且可以ntohl()在x86/x64架构上提供最有效的组件,那将是非常棒的.最终我的代码也需要可移植到ARM.
c# ×2
c++ ×2
atexit ×1
boost ×1
boost-asio ×1
c++-cli ×1
dll ×1
endianness ×1
ienumerable ×1
inline ×1
linq ×1
mixed-mode ×1
protobuf-net ×1
templates ×1
visual-c++ ×1