MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc - #35422

Merged
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at
May 22, 2023
Merged

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc#35422
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at

Conversation

@felipecrv

Copy link
Copy Markdown
Contributor

Rationale for this change

vector::at performs bounds checking and can throw an exception [1]. Its use is discouraged and in this specific case, the access is provably safe because array is previously resized to buffers.size().

[1] https://en.cppreference.com/w/cpp/container/vector/at

What changes are included in this PR?

Use of operator[] instead of at().

Are these changes tested?

By the existing concatenation tests.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@bkietz

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels May 4, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Rebased and pushed again to see if all CI can pass now.

@pitrou

Copy link
Copy Markdown
Member

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@mapleFU

Copy link
Copy Markdown
Member
staticvoidVectorIndex(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec[i];
benchmark::DoNotOptimize(v);
}
}
}
// Register the function as a benchmarkBENCHMARK(VectorIndex);
staticvoidVectorAt(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec.at(i);
benchmark::DoNotOptimize(v);
}
}
}
BENCHMARK(VectorAt);

With release(-O2) on my MacOS:

------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------
VectorIndex 24632 ns 17785 ns 38620
VectorAt 37438 ns 31141 ns 21829

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@pitrou C++ lore.

at() is forbidden in exception-free codebases which Arrow mostly is: Status and Result instead of throw everywhere.

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

@pitrou

Copy link
Copy Markdown
Member

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

Ah, that's a good point.

@pitrou

Copy link
Copy Markdown
Member

The "AMD64 Conda C++" CI failure seems unexpected, can you take a look?

@felipecrv

felipecrv commented May 10, 2023

Copy link
Copy Markdown
ContributorAuthor

@pitrou I only found unreleated issues, but one of them is being fixed in mapleFU's PR.

When that is merged I will rebase and force-push here.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I pushed a commit here to test a fix for parquet CI tests. If it passes, I will create a separate issue/PR for it.

Comment threadcpp/src/parquet/encryption/test_encryption_util.cc Outdated
@pitrou

Copy link
Copy Markdown
Member

Can you rebase on git main so as to get a slightly less failing CI? :-)

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Can you rebase on git main so as to get a slightly less failing CI? :-)

I'm waiting for @mapleFU's PR to be merged.

@felipecrv
felipecrvforce-pushed the at branch 2 times, most recently from 663fd5f to ff22339CompareMay 17, 2023 18:52
The access is safe because array is previously resized to buffers.size()
@pitrou

Copy link
Copy Markdown
Member

CI failures are unrelated, will merge.

@pitrou
pitrou merged commit 2216a0a into apache:mainMay 22, 2023
@felipecrv
felipecrv deleted the at branch May 22, 2023 18:25
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 584dc7b and contender = 2216a0a. 2216a0a is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.86% ⬆️0.09%] test-mac-arm
[Finished ⬇️1.63% ⬆️4.58%] ursa-i9-9960x
[Finished ⬇️0.52% ⬆️1.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 2216a0a4 ec2-t3-xlarge-us-east-2
[Finished] 2216a0a4 test-mac-arm
[Finished] 2216a0a4 ursa-i9-9960x
[Finished] 2216a0a4 ursa-thinkcentre-m75q
[Finished] 584dc7bc ec2-t3-xlarge-us-east-2
[Finished] 584dc7bc test-mac-arm
[Finished] 584dc7bc ursa-i9-9960x
[Finished] 584dc7bc ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@felipecrv@pitrou@mapleFU@ursabot@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc - #35422

Merged
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at
May 22, 2023
Merged

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc#35422
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at

Conversation

@felipecrv

Copy link
Copy Markdown
Contributor

Rationale for this change

vector::at performs bounds checking and can throw an exception [1]. Its use is discouraged and in this specific case, the access is provably safe because array is previously resized to buffers.size().

[1] https://en.cppreference.com/w/cpp/container/vector/at

What changes are included in this PR?

Use of operator[] instead of at().

Are these changes tested?

By the existing concatenation tests.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@bkietz

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels May 4, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Rebased and pushed again to see if all CI can pass now.

@pitrou

Copy link
Copy Markdown
Member

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@mapleFU

Copy link
Copy Markdown
Member
staticvoidVectorIndex(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec[i];
benchmark::DoNotOptimize(v);
}
}
}
// Register the function as a benchmarkBENCHMARK(VectorIndex);
staticvoidVectorAt(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec.at(i);
benchmark::DoNotOptimize(v);
}
}
}
BENCHMARK(VectorAt);

With release(-O2) on my MacOS:

------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------
VectorIndex 24632 ns 17785 ns 38620
VectorAt 37438 ns 31141 ns 21829

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@pitrou C++ lore.

at() is forbidden in exception-free codebases which Arrow mostly is: Status and Result instead of throw everywhere.

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

@pitrou

Copy link
Copy Markdown
Member

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

Ah, that's a good point.

@pitrou

Copy link
Copy Markdown
Member

The "AMD64 Conda C++" CI failure seems unexpected, can you take a look?

@felipecrv

felipecrv commented May 10, 2023

Copy link
Copy Markdown
ContributorAuthor

@pitrou I only found unreleated issues, but one of them is being fixed in mapleFU's PR.

When that is merged I will rebase and force-push here.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I pushed a commit here to test a fix for parquet CI tests. If it passes, I will create a separate issue/PR for it.

Comment threadcpp/src/parquet/encryption/test_encryption_util.cc Outdated
@pitrou

Copy link
Copy Markdown
Member

Can you rebase on git main so as to get a slightly less failing CI? :-)

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Can you rebase on git main so as to get a slightly less failing CI? :-)

I'm waiting for @mapleFU's PR to be merged.

@felipecrv
felipecrvforce-pushed the at branch 2 times, most recently from 663fd5f to ff22339CompareMay 17, 2023 18:52
The access is safe because array is previously resized to buffers.size()
@pitrou

Copy link
Copy Markdown
Member

CI failures are unrelated, will merge.

@pitrou
pitrou merged commit 2216a0a into apache:mainMay 22, 2023
@felipecrv
felipecrv deleted the at branch May 22, 2023 18:25
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 584dc7b and contender = 2216a0a. 2216a0a is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.86% ⬆️0.09%] test-mac-arm
[Finished ⬇️1.63% ⬆️4.58%] ursa-i9-9960x
[Finished ⬇️0.52% ⬆️1.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 2216a0a4 ec2-t3-xlarge-us-east-2
[Finished] 2216a0a4 test-mac-arm
[Finished] 2216a0a4 ursa-i9-9960x
[Finished] 2216a0a4 ursa-thinkcentre-m75q
[Finished] 584dc7bc ec2-t3-xlarge-us-east-2
[Finished] 584dc7bc test-mac-arm
[Finished] 584dc7bc ursa-i9-9960x
[Finished] 584dc7bc ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@felipecrv@pitrou@mapleFU@ursabot@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc - #35422

Merged
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at
May 22, 2023
Merged

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc#35422
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at

Conversation

@felipecrv

Copy link
Copy Markdown
Contributor

Rationale for this change

vector::at performs bounds checking and can throw an exception [1]. Its use is discouraged and in this specific case, the access is provably safe because array is previously resized to buffers.size().

[1] https://en.cppreference.com/w/cpp/container/vector/at

What changes are included in this PR?

Use of operator[] instead of at().

Are these changes tested?

By the existing concatenation tests.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@bkietz

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels May 4, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Rebased and pushed again to see if all CI can pass now.

@pitrou

Copy link
Copy Markdown
Member

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@mapleFU

Copy link
Copy Markdown
Member
staticvoidVectorIndex(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec[i];
benchmark::DoNotOptimize(v);
}
}
}
// Register the function as a benchmarkBENCHMARK(VectorIndex);
staticvoidVectorAt(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec.at(i);
benchmark::DoNotOptimize(v);
}
}
}
BENCHMARK(VectorAt);

With release(-O2) on my MacOS:

------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------
VectorIndex 24632 ns 17785 ns 38620
VectorAt 37438 ns 31141 ns 21829

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@pitrou C++ lore.

at() is forbidden in exception-free codebases which Arrow mostly is: Status and Result instead of throw everywhere.

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

@pitrou

Copy link
Copy Markdown
Member

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

Ah, that's a good point.

@pitrou

Copy link
Copy Markdown
Member

The "AMD64 Conda C++" CI failure seems unexpected, can you take a look?

@felipecrv

felipecrv commented May 10, 2023

Copy link
Copy Markdown
ContributorAuthor

@pitrou I only found unreleated issues, but one of them is being fixed in mapleFU's PR.

When that is merged I will rebase and force-push here.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I pushed a commit here to test a fix for parquet CI tests. If it passes, I will create a separate issue/PR for it.

Comment threadcpp/src/parquet/encryption/test_encryption_util.cc Outdated
@pitrou

Copy link
Copy Markdown
Member

Can you rebase on git main so as to get a slightly less failing CI? :-)

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Can you rebase on git main so as to get a slightly less failing CI? :-)

I'm waiting for @mapleFU's PR to be merged.

@felipecrv
felipecrvforce-pushed the at branch 2 times, most recently from 663fd5f to ff22339CompareMay 17, 2023 18:52
The access is safe because array is previously resized to buffers.size()
@pitrou

Copy link
Copy Markdown
Member

CI failures are unrelated, will merge.

@pitrou
pitrou merged commit 2216a0a into apache:mainMay 22, 2023
@felipecrv
felipecrv deleted the at branch May 22, 2023 18:25
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 584dc7b and contender = 2216a0a. 2216a0a is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.86% ⬆️0.09%] test-mac-arm
[Finished ⬇️1.63% ⬆️4.58%] ursa-i9-9960x
[Finished ⬇️0.52% ⬆️1.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 2216a0a4 ec2-t3-xlarge-us-east-2
[Finished] 2216a0a4 test-mac-arm
[Finished] 2216a0a4 ursa-i9-9960x
[Finished] 2216a0a4 ursa-thinkcentre-m75q
[Finished] 584dc7bc ec2-t3-xlarge-us-east-2
[Finished] 584dc7bc test-mac-arm
[Finished] 584dc7bc ursa-i9-9960x
[Finished] 584dc7bc ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@felipecrv@pitrou@mapleFU@ursabot@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc - #35422

Merged
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at
May 22, 2023
Merged

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc#35422
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at

Conversation

@felipecrv

Copy link
Copy Markdown
Contributor

Rationale for this change

vector::at performs bounds checking and can throw an exception [1]. Its use is discouraged and in this specific case, the access is provably safe because array is previously resized to buffers.size().

[1] https://en.cppreference.com/w/cpp/container/vector/at

What changes are included in this PR?

Use of operator[] instead of at().

Are these changes tested?

By the existing concatenation tests.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@bkietz

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels May 4, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Rebased and pushed again to see if all CI can pass now.

@pitrou

Copy link
Copy Markdown
Member

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@mapleFU

Copy link
Copy Markdown
Member
staticvoidVectorIndex(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec[i];
benchmark::DoNotOptimize(v);
}
}
}
// Register the function as a benchmarkBENCHMARK(VectorIndex);
staticvoidVectorAt(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec.at(i);
benchmark::DoNotOptimize(v);
}
}
}
BENCHMARK(VectorAt);

With release(-O2) on my MacOS:

------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------
VectorIndex 24632 ns 17785 ns 38620
VectorAt 37438 ns 31141 ns 21829

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@pitrou C++ lore.

at() is forbidden in exception-free codebases which Arrow mostly is: Status and Result instead of throw everywhere.

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

@pitrou

Copy link
Copy Markdown
Member

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

Ah, that's a good point.

@pitrou

Copy link
Copy Markdown
Member

The "AMD64 Conda C++" CI failure seems unexpected, can you take a look?

@felipecrv

felipecrv commented May 10, 2023

Copy link
Copy Markdown
ContributorAuthor

@pitrou I only found unreleated issues, but one of them is being fixed in mapleFU's PR.

When that is merged I will rebase and force-push here.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I pushed a commit here to test a fix for parquet CI tests. If it passes, I will create a separate issue/PR for it.

Comment threadcpp/src/parquet/encryption/test_encryption_util.cc Outdated
@pitrou

Copy link
Copy Markdown
Member

Can you rebase on git main so as to get a slightly less failing CI? :-)

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Can you rebase on git main so as to get a slightly less failing CI? :-)

I'm waiting for @mapleFU's PR to be merged.

@felipecrv
felipecrvforce-pushed the at branch 2 times, most recently from 663fd5f to ff22339CompareMay 17, 2023 18:52
The access is safe because array is previously resized to buffers.size()
@pitrou

Copy link
Copy Markdown
Member

CI failures are unrelated, will merge.

@pitrou
pitrou merged commit 2216a0a into apache:mainMay 22, 2023
@felipecrv
felipecrv deleted the at branch May 22, 2023 18:25
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 584dc7b and contender = 2216a0a. 2216a0a is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.86% ⬆️0.09%] test-mac-arm
[Finished ⬇️1.63% ⬆️4.58%] ursa-i9-9960x
[Finished ⬇️0.52% ⬆️1.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 2216a0a4 ec2-t3-xlarge-us-east-2
[Finished] 2216a0a4 test-mac-arm
[Finished] 2216a0a4 ursa-i9-9960x
[Finished] 2216a0a4 ursa-thinkcentre-m75q
[Finished] 584dc7bc ec2-t3-xlarge-us-east-2
[Finished] 584dc7bc test-mac-arm
[Finished] 584dc7bc ursa-i9-9960x
[Finished] 584dc7bc ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@felipecrv@pitrou@mapleFU@ursabot@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc - #35422

Merged
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at
May 22, 2023
Merged

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc#35422
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at

Conversation

@felipecrv

Copy link
Copy Markdown
Contributor

Rationale for this change

vector::at performs bounds checking and can throw an exception [1]. Its use is discouraged and in this specific case, the access is provably safe because array is previously resized to buffers.size().

[1] https://en.cppreference.com/w/cpp/container/vector/at

What changes are included in this PR?

Use of operator[] instead of at().

Are these changes tested?

By the existing concatenation tests.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@bkietz

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels May 4, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Rebased and pushed again to see if all CI can pass now.

@pitrou

Copy link
Copy Markdown
Member

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@mapleFU

Copy link
Copy Markdown
Member
staticvoidVectorIndex(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec[i];
benchmark::DoNotOptimize(v);
}
}
}
// Register the function as a benchmarkBENCHMARK(VectorIndex);
staticvoidVectorAt(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec.at(i);
benchmark::DoNotOptimize(v);
}
}
}
BENCHMARK(VectorAt);

With release(-O2) on my MacOS:

------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------
VectorIndex 24632 ns 17785 ns 38620
VectorAt 37438 ns 31141 ns 21829

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@pitrou C++ lore.

at() is forbidden in exception-free codebases which Arrow mostly is: Status and Result instead of throw everywhere.

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

@pitrou

Copy link
Copy Markdown
Member

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

Ah, that's a good point.

@pitrou

Copy link
Copy Markdown
Member

The "AMD64 Conda C++" CI failure seems unexpected, can you take a look?

@felipecrv

felipecrv commented May 10, 2023

Copy link
Copy Markdown
ContributorAuthor

@pitrou I only found unreleated issues, but one of them is being fixed in mapleFU's PR.

When that is merged I will rebase and force-push here.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I pushed a commit here to test a fix for parquet CI tests. If it passes, I will create a separate issue/PR for it.

Comment threadcpp/src/parquet/encryption/test_encryption_util.cc Outdated
@pitrou

Copy link
Copy Markdown
Member

Can you rebase on git main so as to get a slightly less failing CI? :-)

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Can you rebase on git main so as to get a slightly less failing CI? :-)

I'm waiting for @mapleFU's PR to be merged.

@felipecrv
felipecrvforce-pushed the at branch 2 times, most recently from 663fd5f to ff22339CompareMay 17, 2023 18:52
The access is safe because array is previously resized to buffers.size()
@pitrou

Copy link
Copy Markdown
Member

CI failures are unrelated, will merge.

@pitrou
pitrou merged commit 2216a0a into apache:mainMay 22, 2023
@felipecrv
felipecrv deleted the at branch May 22, 2023 18:25
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 584dc7b and contender = 2216a0a. 2216a0a is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.86% ⬆️0.09%] test-mac-arm
[Finished ⬇️1.63% ⬆️4.58%] ursa-i9-9960x
[Finished ⬇️0.52% ⬆️1.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 2216a0a4 ec2-t3-xlarge-us-east-2
[Finished] 2216a0a4 test-mac-arm
[Finished] 2216a0a4 ursa-i9-9960x
[Finished] 2216a0a4 ursa-thinkcentre-m75q
[Finished] 584dc7bc ec2-t3-xlarge-us-east-2
[Finished] 584dc7bc test-mac-arm
[Finished] 584dc7bc ursa-i9-9960x
[Finished] 584dc7bc ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@felipecrv@pitrou@mapleFU@ursabot@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc - #35422

Merged
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at
May 22, 2023
Merged

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc#35422
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at

Conversation

@felipecrv

Copy link
Copy Markdown
Contributor

Rationale for this change

vector::at performs bounds checking and can throw an exception [1]. Its use is discouraged and in this specific case, the access is provably safe because array is previously resized to buffers.size().

[1] https://en.cppreference.com/w/cpp/container/vector/at

What changes are included in this PR?

Use of operator[] instead of at().

Are these changes tested?

By the existing concatenation tests.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@bkietz

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels May 4, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Rebased and pushed again to see if all CI can pass now.

@pitrou

Copy link
Copy Markdown
Member

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@mapleFU

Copy link
Copy Markdown
Member
staticvoidVectorIndex(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec[i];
benchmark::DoNotOptimize(v);
}
}
}
// Register the function as a benchmarkBENCHMARK(VectorIndex);
staticvoidVectorAt(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec.at(i);
benchmark::DoNotOptimize(v);
}
}
}
BENCHMARK(VectorAt);

With release(-O2) on my MacOS:

------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------
VectorIndex 24632 ns 17785 ns 38620
VectorAt 37438 ns 31141 ns 21829

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@pitrou C++ lore.

at() is forbidden in exception-free codebases which Arrow mostly is: Status and Result instead of throw everywhere.

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

@pitrou

Copy link
Copy Markdown
Member

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

Ah, that's a good point.

@pitrou

Copy link
Copy Markdown
Member

The "AMD64 Conda C++" CI failure seems unexpected, can you take a look?

@felipecrv

felipecrv commented May 10, 2023

Copy link
Copy Markdown
ContributorAuthor

@pitrou I only found unreleated issues, but one of them is being fixed in mapleFU's PR.

When that is merged I will rebase and force-push here.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I pushed a commit here to test a fix for parquet CI tests. If it passes, I will create a separate issue/PR for it.

Comment threadcpp/src/parquet/encryption/test_encryption_util.cc Outdated
@pitrou

Copy link
Copy Markdown
Member

Can you rebase on git main so as to get a slightly less failing CI? :-)

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Can you rebase on git main so as to get a slightly less failing CI? :-)

I'm waiting for @mapleFU's PR to be merged.

@felipecrv
felipecrvforce-pushed the at branch 2 times, most recently from 663fd5f to ff22339CompareMay 17, 2023 18:52
The access is safe because array is previously resized to buffers.size()
@pitrou

Copy link
Copy Markdown
Member

CI failures are unrelated, will merge.

@pitrou
pitrou merged commit 2216a0a into apache:mainMay 22, 2023
@felipecrv
felipecrv deleted the at branch May 22, 2023 18:25
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 584dc7b and contender = 2216a0a. 2216a0a is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.86% ⬆️0.09%] test-mac-arm
[Finished ⬇️1.63% ⬆️4.58%] ursa-i9-9960x
[Finished ⬇️0.52% ⬆️1.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 2216a0a4 ec2-t3-xlarge-us-east-2
[Finished] 2216a0a4 test-mac-arm
[Finished] 2216a0a4 ursa-i9-9960x
[Finished] 2216a0a4 ursa-thinkcentre-m75q
[Finished] 584dc7bc ec2-t3-xlarge-us-east-2
[Finished] 584dc7bc test-mac-arm
[Finished] 584dc7bc ursa-i9-9960x
[Finished] 584dc7bc ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@felipecrv@pitrou@mapleFU@ursabot@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc - #35422

Merged
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at
May 22, 2023
Merged

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc#35422
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at

Conversation

@felipecrv

Copy link
Copy Markdown
Contributor

Rationale for this change

vector::at performs bounds checking and can throw an exception [1]. Its use is discouraged and in this specific case, the access is provably safe because array is previously resized to buffers.size().

[1] https://en.cppreference.com/w/cpp/container/vector/at

What changes are included in this PR?

Use of operator[] instead of at().

Are these changes tested?

By the existing concatenation tests.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@bkietz

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels May 4, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Rebased and pushed again to see if all CI can pass now.

@pitrou

Copy link
Copy Markdown
Member

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@mapleFU

Copy link
Copy Markdown
Member
staticvoidVectorIndex(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec[i];
benchmark::DoNotOptimize(v);
}
}
}
// Register the function as a benchmarkBENCHMARK(VectorIndex);
staticvoidVectorAt(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec.at(i);
benchmark::DoNotOptimize(v);
}
}
}
BENCHMARK(VectorAt);

With release(-O2) on my MacOS:

------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------
VectorIndex 24632 ns 17785 ns 38620
VectorAt 37438 ns 31141 ns 21829

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@pitrou C++ lore.

at() is forbidden in exception-free codebases which Arrow mostly is: Status and Result instead of throw everywhere.

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

@pitrou

Copy link
Copy Markdown
Member

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

Ah, that's a good point.

@pitrou

Copy link
Copy Markdown
Member

The "AMD64 Conda C++" CI failure seems unexpected, can you take a look?

@felipecrv

felipecrv commented May 10, 2023

Copy link
Copy Markdown
ContributorAuthor

@pitrou I only found unreleated issues, but one of them is being fixed in mapleFU's PR.

When that is merged I will rebase and force-push here.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I pushed a commit here to test a fix for parquet CI tests. If it passes, I will create a separate issue/PR for it.

Comment threadcpp/src/parquet/encryption/test_encryption_util.cc Outdated
@pitrou

Copy link
Copy Markdown
Member

Can you rebase on git main so as to get a slightly less failing CI? :-)

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Can you rebase on git main so as to get a slightly less failing CI? :-)

I'm waiting for @mapleFU's PR to be merged.

@felipecrv
felipecrvforce-pushed the at branch 2 times, most recently from 663fd5f to ff22339CompareMay 17, 2023 18:52
The access is safe because array is previously resized to buffers.size()
@pitrou

Copy link
Copy Markdown
Member

CI failures are unrelated, will merge.

@pitrou
pitrou merged commit 2216a0a into apache:mainMay 22, 2023
@felipecrv
felipecrv deleted the at branch May 22, 2023 18:25
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 584dc7b and contender = 2216a0a. 2216a0a is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.86% ⬆️0.09%] test-mac-arm
[Finished ⬇️1.63% ⬆️4.58%] ursa-i9-9960x
[Finished ⬇️0.52% ⬆️1.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 2216a0a4 ec2-t3-xlarge-us-east-2
[Finished] 2216a0a4 test-mac-arm
[Finished] 2216a0a4 ursa-i9-9960x
[Finished] 2216a0a4 ursa-thinkcentre-m75q
[Finished] 584dc7bc ec2-t3-xlarge-us-east-2
[Finished] 584dc7bc test-mac-arm
[Finished] 584dc7bc ursa-i9-9960x
[Finished] 584dc7bc ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@felipecrv@pitrou@mapleFU@ursabot@bkietz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc - #35422

Merged
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at
May 22, 2023
Merged

MINOR: [C++] Use [] instead of exception-throwing at(i) in concatenate.cc#35422
pitrou merged 1 commit into
apache:mainfrom
felipecrv:at

Conversation

@felipecrv

Copy link
Copy Markdown
Contributor

Rationale for this change

vector::at performs bounds checking and can throw an exception [1]. Its use is discouraged and in this specific case, the access is provably safe because array is previously resized to buffers.size().

[1] https://en.cppreference.com/w/cpp/container/vector/at

What changes are included in this PR?

Use of operator[] instead of at().

Are these changes tested?

By the existing concatenation tests.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@bkietz

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels May 4, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Rebased and pushed again to see if all CI can pass now.

@pitrou

Copy link
Copy Markdown
Member

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@mapleFU

Copy link
Copy Markdown
Member
staticvoidVectorIndex(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec[i];
benchmark::DoNotOptimize(v);
}
}
}
// Register the function as a benchmarkBENCHMARK(VectorIndex);
staticvoidVectorAt(benchmark::State& state) {
// Code inside this loop is measured repeatedly
std::vector<int64_t> range_vec(10000, 0);
for (auto _ : state) {
// Make sure the variable is not optimized away by compilerfor (int i = 0; i < 10000; ++i) {
int64_t v = range_vec.at(i);
benchmark::DoNotOptimize(v);
}
}
}
BENCHMARK(VectorAt);

With release(-O2) on my MacOS:

------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------
VectorIndex 24632 ns 17785 ns 38620
VectorAt 37438 ns 31141 ns 21829

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

This PR is ok but I'm not sure std::vector::at is "discouraged". Can you provide a reference to that claim?

@pitrou C++ lore.

at() is forbidden in exception-free codebases which Arrow mostly is: Status and Result instead of throw everywhere.

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

@pitrou

Copy link
Copy Markdown
Member

We return a bad Status when we bounds-check and try to avoid bounds-checking when we can prove that access is safe. That's why I believe it's fair to say the use of at is discouraged — Arrow's bounds-checks are explicit, non-superfluous and lead to bad Status instead of an exception being thrown.

Ah, that's a good point.

@pitrou

Copy link
Copy Markdown
Member

The "AMD64 Conda C++" CI failure seems unexpected, can you take a look?

@felipecrv

felipecrv commented May 10, 2023

Copy link
Copy Markdown
ContributorAuthor

@pitrou I only found unreleated issues, but one of them is being fixed in mapleFU's PR.

When that is merged I will rebase and force-push here.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I pushed a commit here to test a fix for parquet CI tests. If it passes, I will create a separate issue/PR for it.

Comment threadcpp/src/parquet/encryption/test_encryption_util.cc Outdated
@pitrou

Copy link
Copy Markdown
Member

Can you rebase on git main so as to get a slightly less failing CI? :-)

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

Can you rebase on git main so as to get a slightly less failing CI? :-)

I'm waiting for @mapleFU's PR to be merged.

@felipecrv
felipecrvforce-pushed the at branch 2 times, most recently from 663fd5f to ff22339CompareMay 17, 2023 18:52
The access is safe because array is previously resized to buffers.size()
@pitrou

Copy link
Copy Markdown
Member

CI failures are unrelated, will merge.

@pitrou
pitrou merged commit 2216a0a into apache:mainMay 22, 2023
@felipecrv
felipecrv deleted the at branch May 22, 2023 18:25
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 584dc7b and contender = 2216a0a. 2216a0a is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.86% ⬆️0.09%] test-mac-arm
[Finished ⬇️1.63% ⬆️4.58%] ursa-i9-9960x
[Finished ⬇️0.52% ⬆️1.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 2216a0a4 ec2-t3-xlarge-us-east-2
[Finished] 2216a0a4 test-mac-arm
[Finished] 2216a0a4 ursa-i9-9960x
[Finished] 2216a0a4 ursa-thinkcentre-m75q
[Finished] 584dc7bc ec2-t3-xlarge-us-east-2
[Finished] 584dc7bc test-mac-arm
[Finished] 584dc7bc ursa-i9-9960x
[Finished] 584dc7bc ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@felipecrv@pitrou@mapleFU@ursabot@bkietz