小编Mar*_*ark的帖子

LINQ为什么"Enumerable = Enumerable.Skip(N)"慢?

我遇到了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# linq ienumerable

14
推荐指数
2
解决办法
1317
查看次数

混合模式C++/CLI DLL在退出时抛出异常

我遇到了我创建的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)

dll mixed-mode boost c++-cli atexit

9
推荐指数
1
解决办法
2781
查看次数

protobuf-net:无法反序列化ReadOnlyCollection

我正在尝试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.

c# protobuf-net readonly-collection

9
推荐指数
1
解决办法
540
查看次数

C++显式模板化函数实例化,用于不同类型的模板化类

我试图在类型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++ templates visual-c++

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

C++/Boost ASIO中的内联ntohs()/ ntohl()

嗨,我正在使用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++ inline endianness boost-asio

3
推荐指数
1
解决办法
2540
查看次数