主頁 > 軟體工程 > 我可以更改凍結字串的編碼而不復制它嗎?

我可以更改凍結字串的編碼而不復制它嗎?

2022-11-16 16:36:58 軟體工程

String 和它的副本可以共享相同的底層記憶體嗎?Ruby 中寫時復制嗎?

我有一個大的、凍結的字串,我想更改它的編碼。但我不想為了這樣做而復制整個字串。對于背景關系,這是將值傳遞給具有該bytes型別且僅接受 Encoding::ASCII_8BIT 的 Google Protocol Buffer。

big_string.freeze

MyProtobuf::SomeMessage.new(
  # I would prefer not to have to copy the whole string just to
  # change the encoding.
  value: big_string.dup.force_encoding(Encoding::ASCII_8BIT)
)

uj5u.com熱心網友回復:

它對我來說似乎作業得很好:(使用 MRI/YARV 1.9、2.x、3.x)

require 'objspace'

big_string = Random.bytes(1_000_000).force_encoding(Encoding::UTF_8)

big_string.encoding #=> #<Encoding:UTF-8>
big_string.bytesize #=> 1000000
ObjectSpace.memsize_of(big_string) #=> 1000041


dup_string = big_string.dup.force_encoding(Encoding::ASCII_8BIT)

dup_string.encoding #=> #<Encoding:ASCII-8BIT>
dup_string.bytesize #=> 1000000
ObjectSpace.memsize_of(dup_string) #=> 40

這 40 個位元組是在 Ruby 中容納一個物件 (RVALUE) 的大小。

請注意,不是dup/force_encoding(Encoding::ASCII_8BIT)還有b它會立即回傳二進制編碼的副本。

有關更深入的資訊,請參閱 2012 年 (Ruby 1.9) 中有關 Ruby 中的寫時復制/共享字串的博文:

  • Seeing double:Ruby 如何共享字串值

摘自作者的書《顯微鏡下的紅寶石》:(第 265 頁)

在內部,JRuby 和 MRI 都對字串和其他資料使用稱為寫時復制的優化。這個技巧允許兩個相同的字串值共享同一個資料緩沖區,這既節省了記憶體又節省了時間,因為 Ruby 避免了不必要地單獨復制相同的字串資料。

uj5u.com熱心網友回復:

String 和它的副本可以共享相同的底層記憶體嗎?Ruby 中寫時復制嗎?

Ruby 語言規范中沒有任何內容可以阻止這種情況。Ruby 語言規范中也沒有任何強制執行的內容。

一般來說,Ruby 語言規范試圖對所有與記憶體管理、空間復雜度、步驟復雜度或時間復雜度相關的事情保持沉默。這并不是 Ruby 語言規范獨有的,大多數語言規范都試圖為實作者留出盡可能多的余地。換句話說,語言規范傾向于指定語法語意,而離開語用學取決于實施者。(C 有點例外,因為它指定了標準庫中演算法的空間和時間復雜度。)即使是通常被認為是一種可以讓您完全控制一切的語言的 C,實際上也沒有指定諸如精確的記憶體布局——例如,由于標準中術語寬度uint16_t的定義,實際上允許 a 占用超過 16 位!

每個實作者都可以自由地實作他們想要的字串,只要它們符合 Ruby 語言規范中定義的語意。

如果我沒記錯的話,RubiniusTruffleRuby 都曾一度嘗試過String基于Ropes的實作。TruffleRuby 的首席開發人員Chris Seaton撰寫了一篇關于該實作的論文但是,我不知道他們是否還在使用它。(我知道 TruffleRuby 最近轉向了Truffle Strings,我不確定它們的底層表示是什么……或者它們是否甚至保證特定的底層表示。)

但是,“您必須查看規范”的答案存在問題:不幸的是,與許多其他編程語言不同,Ruby 語言規范并不作為單個檔案存在于一個地方。Ruby 沒有一個單一的正式規范來定義某些語言結構的含義。

有幾種資源,它們的總和可以被認為是一種 Ruby 編程語言的規范。

其中一些資源是:

  • ISO/IEC 30170 :2012資訊技術——編程語言——Ruby規范 ——請注意,ISO Ruby 規范是在 2009 年至 2010 年左右撰寫的,其特定目標是讓當時所有現有的 Ruby 實作都能輕松兼容。由于 YARV 和 MacRuby 僅實作 Ruby 1.9 ,MRI 僅實作 Ruby 1.8 及更低版本,而 JRuby、XRuby、Ruby.NET 和 IronRuby(當時)僅實作 Ruby 1.8 的子集,這意味著 ISO Ruby 規范僅包含Ruby 1.8 和 Ruby 1.9 共有的功能。此外,ISO Ruby 規范特別旨在最小化并且僅包含撰寫 Ruby 程式絕對需要的功能。正因為如此,它確實體如僅指定String它非常廣泛(因為它們在 Ruby 1.8 和 Ruby 1.9 之間發生了顯著變化)。它顯然也沒有指定在撰寫 ISO Ruby 規范后添加的功能,例如 Ractors 或模式匹配。
  • Ruby Spec Suite 又名ruby/spec ——請注意,ruby/spec不幸的是,它遠未完成。然而,我非常喜歡它,因為它是用 Ruby 而不是“ISO-standardese”撰寫的,這對于 Rubyist 來說更容易閱讀,而且它還可以作為一個可執行的一致性測驗套件。
  • The Ruby Programming Language by David Flanagan and Yukihiro 'matz' Matsumoto  – 這本書由 David Flanagan 和 Ruby 的創造者 matz 共同撰寫,作為 Ruby 的語言參考。
  • Programming Ruby作者:Dave Thomas、Andy Hunt 和 Chad Fowler  – 這本書是第一本關于 Ruby 的英文書籍,長期以來一直是 Ruby的標準介紹和描述。本書還首先記錄了 Ruby 核心庫和標準庫,作者將該檔案回饋給了社區。
  • Ruby 問題跟蹤系統特別是功能子跟蹤器 ——但是,請注意,不幸的是,社區在區分關于 Ruby 編程語言的票證和關于 YARV Ruby 實作的票證方面真的非常糟糕:它們都混雜在跟蹤器。
  • Ruby 開發者會議的會議記錄(同樣的問題:Ruby 和 YARV 混合在一起。)
  • 郵件串列中經常討論新功能,特別是ruby??-core(英語)ruby??-dev(日語)郵件串列。(又是同樣的問題。)
  • Ruby 檔案——同樣,請注意該 檔案是從 YARV 的源代碼生成的,并且不區分 Ruby 的特性和 YARV 的特性。
  • 過去,有幾次對 Ruby 規范進行形式化更改的嘗試,例如Ruby 更改請求 (RCR)Ruby 增強建議 (REP)流程,均未成功。
  • 如果一切都失敗了,您需要檢查流行的 Ruby 實作的源代碼以了解它們實際做了什么。請注意復數形式:您必須查看多個(最好是所有)實作以找出共識是什么。只看一個實作不可能告訴你你正在看的是這個特定實作的一個實作怪癖,還是 Ruby 語言的普遍認可的行為。

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/534550.html

標籤:红宝石写时复制

上一篇:提取哈希的JSON名稱

下一篇:Rails字串每隔一個“.”拆分一次。

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more