• 6

Windows 8 (Phone, Slate), ARM, x86 大統一

>managed code 有 managed code 的限制,
>就算最終轉成 native code, 但還是有限制...

>就像是 c++ code 最終還是改成 machine code,
>而有些事, 還是要靠 assembly code 才能做得到.

>(
>memory 管理就是一個重大區別,
>在 c++, 我可以 malloc 一大塊 memory, 不用初始化, 自行管理,
>在 mangaed code 就不行..
>(memory map of file 做檔案處理..)
>)

以現在最新版的.NET Framework 4來說,已經沒有什麼heap fragmentation的問題,大部份時間garbage collector的效能都比你自己管理記憶體來得好。
如果你一定要自己管理,一樣可以寫一個memory pool class來做啊!前面已經說了.NET assembly最後也是變成machine code在執行,這和native code應用程式有什麼差別呢?
至於memory mapped files,你真的要用就是透過P/Invoke或是C++/CLI的IJW去call Windows API。
.NET應用程式的執行效率並不差,會有差別的是載入時間,因為.NET assembly一般需要經過JIT compiler編譯成machine code再執行。這部份你也可以選擇用NGen先做好,或是在部署的時候做,那就沒這問題。另一方面Microsoft也不斷地在最佳化JIT compiler和NGen的效能,現在NGen已經可以利用多核心,而且只重新編譯受到影響的method,而不需要整個重新編譯相關的assembly。

>MTS/DCOM/COM+ 這些是屬於 OS平台 層級的, 且通常是 native code 的,
>不是 .Net..
>(mono 在 linux 上有 MTS/DOM/COM+ 嗎? 我不太清楚)
>(如果有, mono 在 linux 上的 COM+ 上有提供跟 MS COM+ 上一樣的服務>嗎?..)
>(如果沒有, 那些 COM+ 很容易 porting 上嗎?)
>(同樣的問題... WindowsPhone7 上有提供跟 M S在 windows COM+ 上一>樣的服務嗎?..)

他們都是Microsoft的Component technologies,.NET也是。COM是一種binary standard,規範的是object的memory layout,同時也要求object必需提供well-defined的interfaces以便跨程式語言/程序/機器存取。其他平台一樣可以實作COM,就像Mono實作CLI/C#一樣。COM+則是在COM的基礎上提供一系列的加強服務及元件。
Windows Phone 7有沒有COM/DCOM我不知道,反正Microsoft也不讓一般應用程式開發人員存取native API,但它原本的作業系統Windows Embedded CE 6.0 R3是有COM/DCOM的服務的。

freaky_jon wrote:
>manage...(恕刪)


uint8_t* work_buf=m_mmapf_rtindex.m_data;
// m_mmapf_rtindex.m_data 是 MemoryMapOfFile 的位址,
m_bigdata=work_buf;
m_header=(OLsk_OrisRTIndexHeader*)work_buf;
work_buf+=sizeof(OLsk_OrisRTIndexHeader);
m_hash_table=(uint32_t*)work_buf;
// 直接把一個位址當成一個 pointer to int32, 這是 manager code 做不到的,

int offset=m_hash_table[v_slot_id];
if (offset==0)
return 0;
OLsk_RTIndTokenEntry *token_entry=(OLsk_RTIndTokenEntry*)(m_bigdata+offset);
// 再轉成各種不同的型別, 這也是 managed code 做不到的,




更完整的 code.
inline int OLsk_OrisRTIndex_Base::openIndex()
{
char buf[MAXPATHLEN];
sprintf(buf,"%s%s",m_inddir,ORISRTINDEX_FNAME);
int r;
r=m_mmapf_rtindex.initOpen(buf);
if (r!=0)
return -__LINE__;
uint8_t* work_buf=m_mmapf_rtindex.m_data;
m_bigdata=work_buf;
m_header=(OLsk_OrisRTIndexHeader*)work_buf;
work_buf+=sizeof(OLsk_OrisRTIndexHeader);
m_hash_table=(uint32_t*)work_buf;
OLAssert_g(m_header->m_ver_id=80522);
int hash_bit=m_header->m_hash_bit;
m_hashvalue_bit=32-hash_bit; //hash_bit cannot be >= 32
return 0;
}



inline OLsk_RTIndTokenEntry* OLsk_OrisRTIndex_Base::getTokenEntry(int v_slot_id)
{
int offset=m_hash_table[v_slot_id];
if (offset==0)
return 0;
OLsk_RTIndTokenEntry *token_entry=(OLsk_RTIndTokenEntry*)(m_bigdata+offset);
return token_entry;
}



ec wrote:
uint8_t* w...(恕刪)


純managed code的確做不到,但是你用C#的unsafe block或是C++/CLI可以。
問題在於有必要在managed environment寫這樣的code嗎?Managed code帶來的好處就是安全性、可讀性、維護便利性等等,這種寫法是捨本逐末吧!
現在的compiler已經成熟到可以產生高度最佳化的machine code,真要調效能也該是利用profiler找出瓶頸再對症下藥,如果managed code確實無法產生令人滿意的結果,這時再把相關功能用native code改寫也不遲。


freaky_jon wrote:
純managed code的確做不到,但是你用C#的unsafe block或是C++/CLI可以。
問題在於有必要在managed environment寫這樣的code嗎?Managed code帶來的好處就是安全性、可讀性、維護便利性等等,這種寫法是捨本逐末吧!


c++/cli 在 mono 也是不能用的...
(當初還有個 summer code 什麼的, 還以為有希望, 結果 2006 就沒下文了)

為什麼這種 code 不需要?

一個已經建好的 hashtable, 存在 disk 裏, 我只要找一個資料,
在 c++ 就要 memmapofile, 幾個 pointer 的計算, 就可以取到資料,

用 c#, 就要把整個 file 讀出來, 把所有的 object 產生,
一一的產生, 塞到 hashtable 裏...
再讀取...


其它的東西還很多,
像在 c++,
可以用一次 malloc 產生一個 object array,
而 c# 只能一次 new 一個 object, 放到 referenc array 裏...


struct A
{
int data;
}

我可一次
A *aS=(A*)malloc(sizeof(A)*1000);
一次產生 1000 個 A 的 array,
這樣只產生一個 malloc,


在 c# 要如何做,
class A
{
int data;
}

A[] aS=new A[1000];
for (i=0; i<1000; i++)
aS[i]=new A();
這要產生 1000 次的 malloc,
(
c++ 如果要完全對應 c#
是還要再做 A **aaS=(A**)malloc(sizeof(A*)*1000);
for (i=0; i<1000; i++)
aaS[i]=aS+i;
)


ec wrote:
c++/cli 在 ...(恕刪)


因為牽涉到runtime/library實作的問題,先確認我們討論的是Microsoft實作的.NET Framework。
有沒有必要是視情況而的,我要說的只是每種設計都有優點缺點,作為我們達到目的的工具而言,自然是善用它的優點,避開它的缺點。前面說了,如果因為種種原因你選擇了C#做為開發程式的語言,然後想使用memory-mapped file及pointer運算,那就是使用P/Invoke呼叫Windows API和寫在unsafe block裡。
事實上關於memory-mapped file的部份,Microsoft在.NET Framework 4.0已經幫大家包好class了,放在System.IO.MemoryMappedFiles namespace裡,底層其實就是呼叫Windows的CreateFileMapping() API。

至於你提到的memory allocation問題,在.NET Framework裡memory allocation是O(1) operation,因為runtime原本就是allocate一塊大記憶體,當我們new一個物件時,runtime只需要調整pointer就可以把記憶體給程式使用,需要注意的其實是物件的消滅,因為並沒有辦法決定發生的時間。
freaky_jon wrote:
先確認我們討論的是Microsoft實作的.NET Framework。


這篇應該是我發的文章吧!
我怎麼不知道我在討論這個...
(.NetFx Framework 的 P/Invoke, C++/CLI 的 mixed native/managed code 我都有用過)
(
在 windows mobile 的 .net CompactFx + P/Invoke 我也寫過,
在 windows phone7 的 P/Invoke 也不能用了吧!
(updated!
Windows phone7 是用 silverlight, 之前 vs2k10 release 有聽過, 限制很多,
不過未來的 silverlight 是 ok 的..
http://www.microsoft.com/silverlight/future/
•Call existing unmanaged code directly from within Silverlight with PInvoke.
)
)


一開始是在說 .net(純 managed code) 是不是適合開發像 browser/office 這樣大型軟體,
(
也就是現在 ipad/andorid/windowsphone7 的第三方廠商 ap.
)
我是在說有些東西 c#/.net 是無法能取代的 native code (imply c/c++) 的...
(用 c/c++,native 寫的軟體, 不是 c#/.net 能輕勝任的)
(我寫那些 code, 也不是故意找出 c#/.net 不能做的,
而是 performance 會差很多,
.net fx 在物件很多, 又需要做資源回收, 判斷那些物件不再被使用,
要 trace 一堆使用中物件的參考連結, 還是要費一些時間)

而你說的是 c#/.net + NGen 和 JIT = native code (imply 取代 c/c++)


ec wrote:
這篇應該是我發的文章...(恕刪)


我一開始的回文只是要釐清任何.NET code在執行前都被編譯了兩次,一次是經過source compiler編譯成MSIL code,第二次是經過JIT或NGen編譯成machine code。
從頭到尾我要講的就是這個,沒有其他隱含的意義。

ec wrote:
之前看到的消息Win...(恕刪)


Windows 8 ARM 版至少會有 Office ARM 版可以用,
那一般辦公應用,已經一大半問題解決了。
如果說 office 等一堆軟體 一定得使用 x86 instruction ..

以前 amd 不是有買過 coding morph
是否可以把 x86 -> arm instruction ??


andy2000a wrote:
如果說 office...(恕刪)


你講的是Transmeta的code-morphing技術嗎?
1. Windows 8有native ARM版本。
2. Microsoft已經展示過ARM版本的Office 2010.
3. 應用程式原則上只需要重新編譯成ARM machine code即可,當然可能要稍微調校一下效能,修改部份程式碼,但相容性向來是Windows平台的優勢。
我想問題點應該不在是否可以,而是在有沒有需要。
  • 6
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?